在gdb中运行可执行文件时,遇到以下错误:
Program received signal SIGFPE, Arithmetic exception.
0x08158307 in radtra_ ()
如何在不重新编译或修改源代码的情况下理解0x08158307的行号和文件是什么?如果它有帮助,源语言是Fortran。
答案 0 :(得分:2)
如何在不重新编译或修改源代码的情况下理解0x08158307的行号和文件是什么?
这并不容易。您可以使用GDB disassemble命令,查找全局变量和CALL
指令的访问权限,并猜测您在radtra_
内的位置。这个例程越大越难,编译器应用的优化程度越高,执行的调用和全局变量访问就越少。
如果您无法猜测,您唯一的选择是:
重新构建添加-g
标志的应用程序,但不修改所有其他编译选项,然后使用addr2line
将地址转换为行号。 (这就是应该从一开始构建应用程序的方式。)
如果无法重建整个应用程序,请仅重建包含radtra_
的源(同样使用相同的标志,但添加-g
)。您应该能够将objdump -d radtra.o
的输出与disassemble
的输出相匹配。匹配后,请阅读readelf -wl radtra.o
或objdump -g radtra.o
的输出,以将radtra_
中的代码偏移与代码生成的源代码行相关联。
聘请专家为您猜测。这并不便宜,因为这种逆向工程技术的人通常都是有收益的,并且重视他们的时间。