我该如何处理gdb中的SIGFPE地址?

时间:2017-02-23 16:03:20

标签: debugging fortran gdb

在gdb中运行可执行文件时,遇到以下错误:

Program received signal SIGFPE, Arithmetic exception.
0x08158307 in radtra_ ()

如何在不重新编译或修改源代码的情况下理解0x08158307的行号和文件是什么?如果它有帮助,源语言是Fortran。

1 个答案:

答案 0 :(得分:2)

  

如何在不重新编译或修改源代码的情况下理解0x08158307的行号和文件是什么?

这并不容易。您可以使用GDB disassemble命令,查找全局变量和CALL指令的访问权限,并猜测您在radtra_内的位置。这个例程越大越难,编译器应用的优化程度越高,执行的调用和全局变量访问就越少。

如果您无法猜测,您唯一的选择是:

  1. 重新构建添加-g标志的应用程序,但不修改所有其他编译选项,然后使用addr2line将地址转换为行号。 (这就是应该从一开始构建应用程序的方式。)

  2. 如果无法重建整个应用程序,请仅重建包含radtra_的源(同样使用相同的标志,但添加-g)。您应该能够将objdump -d radtra.o的输出与disassemble的输出相匹配。匹配后,请阅读readelf -wl radtra.oobjdump -g radtra.o的输出,以将radtra_中的代码偏移与代码生成的源代码行相关联。

  3. 聘请专家为您猜测。这并不便宜,因为这种逆向工程技术的人通常都是有收益的,并且重视他们的时间。