我想我不会在任何教科书中找到它,因为回答这需要经验。 我目前正处于测试/验证我的代码/狩猎漏洞以使其进入生产状态的阶段,并且任何错误都将导致许多人遭受例如黑暗的一面。
在为Fortran编译程序以进行调试时,您设置了哪种标志?
您为生产系统设置了哪种标志?
部署前你做了什么?
生产版本使用ifort
作为编译器,但我使用gfortran
进行测试。我做错了吗?
答案 0 :(得分:51)
-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运行时库应输出回溯错误。“
答案 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
。运行时检查(如边界检查)会增加生成的可执行文件的执行时间。我发现成本往往低得惊人,但可能很高。因此,没有运行时检查生成的编译。