无法在 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 的值的主要内容,如果未能解决你的问题,请参考以下文章

从车辆图像中提取车牌

检查 gdb 中的 C/C++ 堆内存统计信息

网页版批量提取目录下特定文件类型

Firebase 值已正确提取但无法访问?

从Excel中的行中提取唯一值

无法使用 BigQuery 标准 SQL 提取特定 ID 的自定义维度