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

时间:2010-09-09 12:02:29

标签: debugging deployment fortran gfortran fortran90

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

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

  • 您为生产系统设置了哪种标志?

  • 部署前你做了什么?

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

2 个答案:

答案 0 :(得分:51)

Bare minimum


-Og / -O0

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

  

-OG

     

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

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


-g

这个选项实际上可以通过请求编译器生成打算由交互式调试器(GDB)使用的调试信息来进行调试。


Addititonal

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

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

-Wextra“启用一些未被-Wall启用的额外警告标志。”

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

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

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

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

答案 1 :(得分:15)

为了进行调试,我使用:-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。运行时检查(如边界检查)会增加生成的可执行文件的执行时间。我发现成本往往低得惊人,但可能很高。因此,没有运行时检查生成的编译。