确定在GDB下导致SIGSEGV的CPU陷阱?

时间:2015-04-05 23:06:29

标签: linux debugging gdb sigsegv assembly-trap

我在库代码中有一个SIGSEGV的程序。在查看导致SIGSEGV的语句时,没有什么东西会跳出来(见下文)。但是代码使用的是英特尔的AES-NI,我并不熟悉它。

我发布handle all希望抓住造成SIGSEGV的陷阱,但程序仍然只是崩溃而不是告诉我陷阱。

如何让GDB显示导致SIGSEGV

的CPU陷阱
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 个答案:

答案 0 :(得分:1)

  

如何让GDB显示导致SIGSEGV

的CPU陷阱

你不能:GDB没有看到陷阱,只有操作系统。

您可以看到导致陷阱的指令:

(gdb) x/i $pc

问题可能是对齐。我不知道long long __vector是什么,但如果它不是一个16字节的实体,那么subkeys[i+1]将不会是16字节对齐,这对于_mm_aesdec_si128来说会是一个问题,因为它需要两个参数的16字节对齐。

答案 1 :(得分:1)

这些说明很新(AVX)。也可能是CPU不支持该指令,或者OS未配置为允许它们。我知道在这种情况下人们通常会期望SIGILL,但x86在它生成的异常中会令人惊讶,特别是如果操作系统禁止使用CPU支持的指令,SIGSEGV很常见。 (如果从我的语气中不清楚,我只是在猜测,只是说这是一个你可能想要研究的调查途径。)