gpt4 book ai didi

c++ - 卡在跟踪 SIGFPE/算术异常

转载 作者:行者123 更新时间:2023-11-28 02:02:53 25 4
gpt4 key购买 nike

我正在尝试调试在我没有源代码的库中引发的 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

当我键入 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 处的指令之后,它跳转到我的异常处理程序。

为了达到这一点,我进行了很多搜索。但目前我不知道该如何继续。

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

引发此异常的原因是什么?

最佳答案

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

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

您说您检查了“奇怪”的值。但上面必须是除以零。你也检查 st 是否为零?必须为零。没有奇怪,只有零。

FDIVRP ST(i), ST(0) 将ST(0)除以ST(i),将结果存入ST(i),弹出寄存器栈

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

关于c++ - 卡在跟踪 SIGFPE/算术异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38687990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com