确定在 GDB 下导致 SIGSEGV 的 CPU 陷阱?
Determine CPU trap that caused SIGSEGV under GDB?
我有一个程序 SIGSEGV
在库代码中。查看导致 SIGSEGV
的语句(见下文)时,我没有任何反应。但是代码用的是Intel的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
= (__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
How can I get GDB to display the CPU trap that's causing the SIGSEGV
你不能:GDB 看不到陷阱,只有 OS 可以。
您看到的是造成陷阱的指令:
(gdb) x/i $pc
很可能是对齐问题。我不知道 long long __vector
是什么,但如果它不是 16 字节的实体,那么 subkeys[i+1]
就不会是 16 字节对齐的,这对 _mm_aesdec_si128
来说是个问题,因为它要求两个参数都进行 16 字节对齐。
这些说明很新 (AVX)。也可能是 CPU 不支持该指令,或者 OS 未配置为允许它们。我知道在这种情况下通常会期望 SIGILL,但是 x86 在它生成的异常中可能会令人惊讶,特别是如果 OS 禁用了 CPU 支持的指令的使用,SIGSEGV 很常见. (如果我的语气不清楚,我只是在这里猜测,只是说这是您可能想要调查的调查途径。)
我有一个程序 SIGSEGV
在库代码中。查看导致 SIGSEGV
的语句(见下文)时,我没有任何反应。但是代码用的是Intel的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
= (__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
How can I get GDB to display the CPU trap that's causing the SIGSEGV
你不能:GDB 看不到陷阱,只有 OS 可以。
您看到的是造成陷阱的指令:
(gdb) x/i $pc
很可能是对齐问题。我不知道 long long __vector
是什么,但如果它不是 16 字节的实体,那么 subkeys[i+1]
就不会是 16 字节对齐的,这对 _mm_aesdec_si128
来说是个问题,因为它要求两个参数都进行 16 字节对齐。
这些说明很新 (AVX)。也可能是 CPU 不支持该指令,或者 OS 未配置为允许它们。我知道在这种情况下通常会期望 SIGILL,但是 x86 在它生成的异常中可能会令人惊讶,特别是如果 OS 禁用了 CPU 支持的指令的使用,SIGSEGV 很常见. (如果我的语气不清楚,我只是在这里猜测,只是说这是您可能想要调查的调查途径。)