Определить ловушку процессора, которая вызвала SIGSEGV под GDB?
У меня есть программа, которая SIGSEGV
в коде библиотеки. Ничто не прыгает на меня, глядя на утверждение, которое вызывает SIGSEGV
(увидеть ниже). Но в коде используется Intel AES-NI, и я не очень знаком с ним.
Я выпустил handle all
в надежде поймать ловушку, которая вызывает SIGSEGV
, но программа все равно просто вылетает, а не говорит мне ловушку.
Как я могу получить GDB для отображения ловушки процессора, которая вызывает SIGSEGV
?
Program received signal SIGSEGV, Segmentation fault.
0x00000000004ddf0b in CryptoPP::AESNI_Dec_Block(long long __vector&, long long __vector const*, unsigned int) (block=..., subkeys=0x7fffffffdc60, rounds=0x0)
at rijndael.cpp:1040
1040 block = _mm_aesdec_si128(block, subkeys[i+1]);
(gdb) p block
$1 = (__m128i &) @0x7fffffffcec0: {0x2e37c840668d6030, 0x431362358943e432}
(gdb) x/16b 0x7fffffffcec0
0x7fffffffcec0: 0x30 0x60 0x8d 0x66 0x40 0xc8 0x37 0x2e
0x7fffffffcec8: 0x32 0xe4 0x43 0x89 0x35 0x62 0x13 0x43
2 ответа
Как я могу заставить GDB отображать ловушку процессора, которая вызывает SIGSEGV
Вы не можете: GDB не видит ловушку, только ОС.
То, что вы видите, это инструкция, которая вызвала ловушку:
(gdb) x/i $pc
Вероятно, проблема в выравнивании. Я не знаю что long long __vector
есть, но если это не 16-байтовая сущность, то subkeys[i+1]
не будет 16-байтовым выравниванием, что будет проблемой для _mm_aesdec_si128
, поскольку требует 16-байтового выравнивания для обоих аргументов.
Эти инструкции довольно новые (AVX). Возможно также, что ЦП не поддерживает инструкции или ОС не настроена на их разрешение. Я знаю, что в таком случае можно ожидать SIGILL, но x86 может удивить тем, что генерирует исключения, особенно если ОС отключила использование инструкции, поддерживаемой ЦП, SIGSEGV довольно распространен. (В случае, если это не ясно из моего тона, я просто догадываюсь здесь, просто говорю, что это направление расследования, которое вы, возможно, захотите изучить.)