如何设置GFORTRAN编译器的标志以捕捉错误代码?

47

我觉得在任何教科书上都找不到这个答案,因为回答这个问题需要经验。 我目前正处于测试/验证代码/查找错误的阶段,以使其达到生产状态,任何错误都会导致很多人遭受痛苦,比如黑暗面。

  • 在编译Fortran程序时,你可以设置哪些标志用于调试目的?

  • 在生产系统中,你可以设置哪些标志?

  • 在部署之前,你可以设置什么?

2个回答

68

最低限度


-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语句覆盖,否则不允许隐式类型定义。 这相当于在每个过程的开头添加 implicit none"。
-fcheck=all设置为"启用运行时测试",例如,数组边界检查等。
使用-fbacktrace来"指定当遇到运行时错误或发出致命信号(如分段错误、非法指令、总线错误或浮点异常)时,Fortran运行时库应输出错误的回溯信息"。

1
使用“mpif90”而不是“gfortran”是否相同? - Truong

21

用于调试的编译参数为:-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。运行时检查,如边界检查,会增加可执行文件的执行时间。我发现成本通常会令人惊讶地低,但也可能很高。因此,在生产编译中不进行任何运行时检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接