2015-04-05 84 views
0

我有一個程序,它是SIGSEGV'庫中的代碼。在查看造成SIGSEGV(參見下文)的聲明時,沒有什麼會跳出來。但是代碼使用了英特爾的AES-NI,我對它並不熟悉。確定在GDB下導致SIGSEGV的CPU陷阱?

我發出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 

回答

1

我怎樣才能得到GDB顯示就引起SIGSEGV

不能將CPU陷阱:GDB沒有能看到的陷阱,只有OS確實。

你能看到的是,引起陷阱的指令:

(gdb) x/i $pc 

這可能是因爲這個問題是對齊。我不知道long long __vector是什麼,但如果它不是16字節的實體,那麼subkeys[i+1]不會是16字節對齊的,這對於_mm_aesdec_si128來說是個問題,因爲它需要兩個參數的16字節對齊。

+0

*「這很可能是問題是對齊... 「* - 這也是我的想法。爲什麼我想看到實際的陷阱。 *「GDB沒有看到陷阱,只有操作系統......」 - - 這太糟糕了。在Windows平臺上,我們可以獲得更豐富的例外信息。操作系統獲取並滲透它。因爲它,我添加了Linux標籤。 – jww 2015-04-08 00:53:30

+0

@jww公平地說,Linux也會在'siginfo'結構中傳播一些陷阱信息,'print $ _siginfo'可能會有所幫助。 – 2015-04-08 05:25:59

1

這些說明很新穎(AVX)。也可能是CPU不支持該指令,或者操作系統未配置爲允許它們。我知道在這種情況下通常會期望SIGILL,但是x86可能會令人驚訝,尤其是在操作系統禁用了CPU支持的指令的情況下,SIGSEGV非常常見。 (如果從我的語氣中不清楚,我只是在這裏猜測,只是說它是一個調查的途徑,你可能想看看。)