我想我在任何教科书中都找不到这个问题,因为回答这个问题需要经验。 我目前正处于测试/验证我的代码/寻找错误以使其进入生产状态的阶段,任何错误都会导致许多人遭受痛苦,例如黑暗面。
为调试目的编译 Fortran 程序时可以设置什么类型的标志?
您可以为生产系统设置什么样的标志?
部署前可以设置什么?
-Og
/-O0
-O0
基本上告诉编译器不进行优化。优化器可以删除一些局部变量,合并一些代码块等,其结果是它可以使调试变得不可预测。 -O0
选项的代价是代码执行速度非常慢,但从 4.8 版本开始,GCC 编译器(包括 Fortran 编译器)接受新引入的优化级别 -Og
:
-奥格
优化调试体验。 -Og 启用不干扰调试的优化。它应该是标准编辑-编译-调试周期的优化级别选择,提供合理的优化级别,同时保持快速编译和良好的调试体验。
所以,如果可能的话使用
-Og
,否则使用 -O0
。
-g
此选项实际上通过请求编译器生成供交互式调试器 (GDB) 使用的调试信息来实现调试。
有很多。我认为最有用的是:
-Wall
“启用有关某些用户认为有问题的结构的所有警告,并且很容易避免(或修改以防止警告),即使与宏结合使用也是如此。”
-Wextra
“启用 -Wall 未启用的一些额外警告标志。”
-pedantic
生成有关 gfortran 支持但不属于官方 Fortran 95 标准的语言功能的警告。甚至可以更加“迂腐”,并使用 -std=f95
标志将警告变成错误。
-fimplicit-none
“指定不允许隐式类型,除非被显式 IMPLICIT 语句覆盖。这相当于在每个过程的开头添加隐式 none。”
-fcheck=all
“启用运行时测试”,例如数组边界检查。
-fbacktrace
“指定,当遇到运行时错误或发出致命信号(分段错误、非法指令、总线错误或浮点异常)时,Fortran 运行时库应输出错误的回溯.”
为了调试,我使用:
-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
。诸如边界检查之类的运行时检查会增加生成的可执行文件的执行时间。我发现成本常常出奇的低,但也可能很高。因此,不会对生产编译进行运行时检查。