Определить ловушку процессора, которая вызвала 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 довольно распространен. (В случае, если это не ясно из моего тона, я просто догадываюсь здесь, просто говорю, что это направление расследования, которое вы, возможно, захотите изучить.)

Другие вопросы по тегам