您为 GFORTRAN 调试器/编译器设置了哪些标志来捕获错误代码?

Posted

技术标签:

【中文标题】您为 GFORTRAN 调试器/编译器设置了哪些标志来捕获错误代码?【英文标题】:What flags do you set for your GFORTRAN debugger/compiler to catch faulty code? 【发布时间】:2011-04-10 05:34:10 【问题描述】:

我想我不会在任何教科书中找到这一点,因为回答这个问题需要经验。 我目前正处于测试/验证我的代码/寻找错误以使其进入生产状态的阶段,任何错误都会导致许多人遭受痛苦,例如黑暗的一面。

在为 Fortran 编译程序以进行调试时,您设置了哪些标志?

你为生产系统设置了什么样的标志?

在部署之前您会做什么?

生产版本使用ifort 作为编译器,但我使用gfortran 进行测试。我做错了吗?

【问题讨论】:

【参考方案1】:

最低限度


-Og/-O0

-O0 基本上告诉编译器不要进行优化。优化器可以删除一些局部变量,合并一些代码块等,结果它可以使调试变得不可预测。 -O0 选项的代价是代码执行速度非常慢,但从 4.8 版 GCC 编译器(包括 Fortran 编译器)开始接受新引入的优化级别 -Og

-Og

优化调试体验。 -Og 启用不干扰调试的优化。它应该是标准编辑-编译-调试周期的首选优化级别,提供合理的优化级别,同时保持快速编译和良好的调试体验。

因此,如果可能,请使用-Og,否则请使用-O0


-g

此选项实际上使调试成为可能,因为它要求编译器生成供交互式调试器 (GDB) 使用的调试信息。


附加

有很多。我认为最有用的是:

-Wall“启用所有关于某些用户认为有问题的结构的警告,并且很容易避免(或修改以防止警告),即使与宏一起使用。”

-Wextra“启用一些额外的警告标志,这些标志没有被 -Wall 启用。”

-pedantic 生成有关 gfortran 支持但不属于 Fortran 95 官方标准的语言功能的警告。可能会更加“迂腐”,并使用-std=f95 标志将警告变为错误。

-fimplicit-none 改为“指定不允许隐式类型,除非被显式 IMPLICIT 语句覆盖。这相当于在每个过程的开头添加隐式 none。”

-fcheck=all“启用运行时测试”,例如数组边界检查。

-fbacktrace 指定当遇到运行时错误或发出致命信号(分段错误、非法指令、总线错误或浮点异常)时,Fortran 运行时库应输出错误的回溯。”

【讨论】:

使用“mpif90”而不是“gfortran”时是一样的吗?【参考方案2】:

对于调试,我使用:-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace。对于尚未解释的内容,请查看 gfortran 手册。 -fcheck=all 包括-fcheck=bounds

对于生产我使用:-O3 -march=native -fimplicit-none -Wall -Wline-truncation -fwhole-file -std=f2008。运行时检查(例如边界检查)会增加生成的可执行文件的执行时间。我发现成本经常低得惊人,但也可能很高。因此,生产时不会对编译进行运行时检查。

【讨论】:

以上是关于您为 GFORTRAN 调试器/编译器设置了哪些标志来捕获错误代码?的主要内容,如果未能解决你的问题,请参考以下文章

Gfortran -Wuninitialized 标志在 do 循环中缺少变量

浮点错误 gfortran

将 gfortran 与英特尔 MKL 链接

在ubuntu上安装了gfortran编译器,出现了大问题哦!!求助啊!!

如何找出使用了哪个编译器:g77 或 gfortran

gfortran 编译器的强制向量化