无法在 GDB 中提取发生 FPE 的值
Posted
技术标签:
【中文标题】无法在 GDB 中提取发生 FPE 的值【英文标题】:Unable to extract in GDB the values where FPE is occuring 【发布时间】:2017-07-06 10:14:32 【问题描述】:我接受了这个问题 Gfortran does not tell me what sort of FPE it is 的 cmets 中给出的建议,即启动 GDB ,在该行设置断点并检查操作的值。一开始我的程序基于 Fortran 77 代码(我计划在运行这个“测试用例”一个理想的 CFD 数据测试后将其迁移到 F90)并在 Ubuntu 16.04 LTS 上使用 NetCDF 共享库。我使用 gfortran 4.8.5 编译器(如果需要可以升级到 5.x)。
程序是这样编译的
gfortran -Wall -O0 -c -g -fbacktrace -ffpe-trap=invalid,denormal,zero,overflow,underflow $tool.f $ncdf_incs
现在我在程序所在的目录下启动gdb,然后输入
break inv_cart.f:1221
这是发生 FPE 的地方(除以零错误)。当我这样做时,我会收到此消息 -
Make breakpoint based on future shared library load (y/n) ?
所以我搜索了这个问题,我得到了这个以前的 Q/A - How to set breakpoints with shared libraries 这就是我所做的
set breakpoint pending on
break inv_cart.f:1221
更新
我有一个疏忽。运行 break 后,我收到此错误消息
No symbol table is loaded. Use the "file" command
Breakpoint 1 (inv_cart.f:1221) is pending.
结束更新
执行此操作后,当我在 gdb 中或单独运行 inv_cart 时遇到相同的错误。
Program received signal SIGFPE - arithmetic exception
后跟一个内存地址和几个问号,后跟 ()。 所以我退出了 gdb,然后它告诉我有一个调试会话仍然处于活动状态。
所以我的问题仍然存在 - 如何获得发生 FPE 的值?
【问题讨论】:
根据未来的共享库负载 (y/n) 创建断点? - 这表明 GDB 实例没有足够的源代码知识来知道在哪里设置断点,因此,它不是在 inv_cart.f:1221 处暂停执行,而是继续运行(因此击中你的 FPE)。您能否提供有关您用于这项工作的编译器标志的更多信息。尝试删除任何优化 (-O#) 并包括 -g (编辑 - 阅读链接的 Q,看看你已经有正确的标志) - 找不到 src 的问题仍然有效。 @s8129 - 有关编译的信息已添加到问题中。 @s8129 - 不确定 NetCDF 共享库如何影响这个问题。 FPE和共享库没有连接 源代码和可执行文件在同一目录吗?如果没有,请尝试添加 -d "PATH TO SRC" 如果没有。 那个命令没有编译程序——只有那个文件。 (-c
选项告诉它不要调用链接器。)确保在编译所有源文件和链接阶段使用 -g 选项。
【参考方案1】:
这是我注意到更新后的一个简单问题。
我查了这个问题 - gdb no symbol table is loaded 然后我继续做了这个
file inv_cart
最后符号表被加载,令我高兴的是,我再次通过 gdb 运行程序,并能够打印发生 FPE 的代码段的值。
【讨论】:
以上是关于无法在 GDB 中提取发生 FPE 的值的主要内容,如果未能解决你的问题,请参考以下文章