我試圖調試在庫中引發的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
的指令後,它跳轉到我的異常處理程序。
我已經搜索了很多甚至到了這一點。但目前我不知道該如何繼續。
我也檢查了浮點寄存器,它們似乎沒有包含任何奇怪的值。
什麼引發這個異常?
在函數調用點鍵入'ni'將運行該函數並在返回時停止(如果遇到斷點或異常,它可能會停止)。有一個不同的命令「stepi」,即使它是一個函數調用,它也只能運行一條指令。 –
@MarkPlotnick是的,馬克。你是對的。發佈後,我意識到我必須使用'stepi'或'si'來運行一條指令。謝謝! – Ali