1. 编译时添加调试信息
使用gfortran编译Fortran程序时,必须添加-g选项,以便在生成的二进制文件中包含源代码级别的调试信息(如行号、变量名、函数调用关系等)。例如:
gfortran -g my_program.f90 -o my_program
若需同时进行调试和优化,建议使用-O0(禁用优化,避免优化导致变量值或执行流程与源代码不一致)与-g组合,如:
gfortran -O0 -g my_program.f90 -o my_program。
2. 使用GDB进行源代码级调试
GDB(GNU Debugger)是Linux下最常用的Fortran调试工具,支持断点设置、单步执行、变量查看等功能。
gdb ./my_program,加载编译好的可执行文件。break命令在指定位置暂停程序执行。例如,在main函数开头设置断点:break main;或在my_subroutine子程序中设置断点:break my_subroutine;也可在特定行号(如第10行)设置断点:break 10。run(或简写r)启动程序。若程序需要命令行参数(如./my_program input.txt),可在run后添加参数:run input.txt。step(或s):逐行执行代码,进入函数内部(如调用my_subroutine时会进入该子程序);next(或n):逐行执行代码,跳过函数调用(直接执行完当前行的函数调用,不进入函数内部)。print(或p)命令查看变量的当前值。例如,查看my_variable的值:print my_variable;查看数组my_array的前5个元素:print my_array(1:5)。backtrace(或bt)命令查看当前函数的调用链,帮助定位程序崩溃的位置(如从main到my_subroutine的调用路径)。continue(或c)让程序从当前断点继续运行,直到下一个断点或程序结束。delete命令删除指定编号的断点(可通过info breakpoints查看断点编号)。例如,删除编号为1的断点:delete 1。。3. 使用Valgrind检查内存问题
Valgrind是强大的内存调试工具,可检测内存泄漏、数组越界、非法内存访问等问题。
sudo apt-get install valgrind;CentOS:sudo yum install valgrind。valgrind --leak-check=full ./my_program(--leak-check=full表示详细显示内存泄漏信息)。程序运行结束后,Valgrind会输出内存泄漏的位置(如某行代码分配的内存未释放)和类型(如“definitely lost”表示明确泄漏)。。4. 使用LLDB进行调试
LLDB是LLVM项目的调试器,功能与GDB类似,适用于调试用gfortran或Intel Fortran编译的程序。
lldb ./my_program加载可执行文件。breakpoint set命令,例如在my_subroutine中设置断点:breakpoint set --name my_subroutine;或在第10行设置断点:breakpoint set --line 10。run启动程序。step(进入函数)、next(跳过函数)。frame variable(或fr v)命令,例如查看my_variable的值:frame variable my_variable。。5. 静态代码分析工具
静态分析工具可在编译前检查代码中的潜在错误(如语法错误、未初始化变量、数组越界风险),无需运行程序。常用工具包括:
cppcheck --enable=all my_program.f90命令扫描代码,输出潜在错误(如“未使用的变量”“数组索引越界”)。clang-tidy my_program.f90 --命令运行。。6. 日志输出辅助调试
在程序中添加日志输出(如使用Fortran的write语句),将程序执行流程、变量值等信息输出到文件或标准输出,帮助定位问题。例如:
program my_program
implicit none
integer :: i, sum = 0
do i = 1, 10
sum = sum + i
write(*, '(A, I2, A, I5)') "i = ", i, ", sum = ", sum ! 输出每一步的i和sum值
end do
print *, "Final sum:", sum
end program my_program
运行程序后,终端会显示每一步的i和sum值,帮助检查循环是否正确执行。。
7. 版本控制系统(如Git)
使用Git等版本控制系统跟踪代码变更历史,当出现问题时,可通过git log查看最近的修改记录,使用git checkout <commit_id>回溯到之前的稳定版本,快速定位引入错误的提交。。