坚持跟踪SIGFPE /算术异常

时间:2016-07-31 20:09:16

标签: c++ assembly gdb

我试图调试在库中引发的SIGFPE信号,我没有它的源代码。我使用gdb和asm布局来查看发生了什么。

这些是例外之前的指示:

   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   

当我输入ni0xcd4000a处的指令转到0xcd4000f处的指令时,我收到以下错误

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

我不熟悉程序集,但我希望指令0xcd408c0AnotherMethodName,其中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

在{{1}}的指令之后,它会跳转到我的异常处理程序。

我已经搜索了很多甚至达到这一点。但目前我不知道应该如何继续。

我还检查了浮点寄存器,它们似乎不包含任何奇怪的值。

是什么引发了这个例外?

1 个答案:

答案 0 :(得分:2)

不能是fldz,因为它只是将寄存器设置为0

异常发生在fdivrp %st,%st(1)

你说你检查了#34; wierd&#34;值。但上面必须是零除。你也检查过零吗?必须为零。没有奇怪,只有零。

FDIVRP ST(i),ST(0)将ST(0)除以ST(i),将结果存储在ST(i)中,然后弹出寄存器堆栈

编辑:不确定那里发生了什么。检查您调用第三方软件的参数。您可能已经传递了一些零值,例如项目数,可能是因为库不喜欢未初始化的变量。 (抱歉所有的猜测!)