2016-07-31 61 views
0

我試圖調試在庫中引發的SIGFPE信號,我沒有它的源代碼。我正在使用gdb和asm佈局來查看正在發生的事情。在追蹤SIGFPE /算術異常時陷入困境

這些都是異常之前的說明:

0xcd3fffa <_ZN8name_space11ClassName1MethodNameEdddd+830>  fstpl -0x68(%ebp)          
B+ 0xcd3fffd <_ZN8name_space11ClassName1MethodNameEdddd+833>  fldl -0x58(%ebp)          
    0xcd40000 <_ZN8name_space11ClassName1MethodNameEdddd+836>  fstpl 0x4(%esp)          
    0xcd40004 <_ZN8name_space11ClassName1MethodNameEdddd+840>  mov 0x8(%ebp),%eax         
    0xcd40007 <_ZN8name_space11ClassName1MethodNameEdddd+843>  mov %eax,(%esp)          
    >0xcd4000a <_ZN8name_space11ClassName1MethodNameEdddd+846>  call 0xcd408c0 <_ZN8name_space11ClassName1AnotherMethodNameEd> 
    0xcd4000f <_ZN8name_space11ClassName1MethodNameEdddd+851>  mov 0x8(%ebp),%eax 

當我鍵入ni從指令去在0xcd4000a到一個在0xcd4000f我收到以下錯誤

Program received signal SIGFPE, Arithmetic exception. 
0x0cd408e8 in name_space::ClassName::AnotherMethodName(double)() at /Path/to/ClassName.h:69 

我不是熟悉裝配,但我期待指針0xcd408c0指示AnotherMethodName開始。但指令指針已跳至0xcd408e8地址。其中還有AnotherMethodName()方法。

0xcd408e4 <_ZN8name_space11ClassName1AnotherMethodNameEd+36> fldz               
    0xcd408e6 <_ZN8name_space11ClassName1AnotherMethodNameEd+38> fdivrp %st,%st(1)            
    >0xcd408e8 <_ZN8name_space11ClassName1AnotherMethodNameEd+40> fldz               
    0xcd408ea <_ZN8name_space11ClassName1AnotherMethodNameEd+42> fucomip %st(1),%st 

0xcd408e8的指令後,它跳轉到我的異常處理程序。

我已經搜索了很多甚至到了這一點。但目前我不知道該如何繼續。

我也檢查了浮點寄存器,它們似乎沒有包含任何奇怪的值。

什麼引發這個異常?

+0

在函數調用點鍵入'ni'將運行該函數並在返回時停止(如果遇到斷點或異常,它可能會停止)。有一個不同的命令「stepi」,即使它是一個函數調用,它也只能運行一條指令。 –

+0

@MarkPlotnick是的,馬克。你是對的。發佈後,我意識到我必須使用'stepi'或'si'來運行一條指令。謝謝! – Ali

回答

2

不能爲fldz,因爲它只是設置寄存器爲0

唯一的例外發生在fdivrp %st,%st(1)

你說你檢查「奇怪」的價值觀。但是以上必須是一個零除。你也檢查st爲零嗎?必須爲零。沒有奇怪的,只是零。

FDIVRP到ST(i),ST(0)除以ST(0),通過ST(我),結果存儲到ST(i),並彈出寄存器堆棧

編輯:不知道發生了什麼事那裏。用你的第三方軟件檢查你的參數。您可能已經傳遞了一些零值,例如項目數量,可能是因爲庫不喜歡的未初始化變量。 (對不起所有的猜測!)

+0

是的,你是對的。 '0xcd408e4'處的'fldz'將'st(0)'設置爲零。然後'fdivrp%st,%st(1)'用'st(0)'分隔'st(1)'。這確實是一個零分!但是''fldz'在'0xcd408e8'後出現異常。你知道爲什麼嗎? – Ali

+0

不確定,但PC在檢測到ZERODIV之前可能已經經歷了該指令。 –