1. 准备工作:安装必要工具
在Ubuntu上调试Fortran代码前,需安装gfortran(Fortran编译器,用于生成可执行文件)和GDB(GNU调试器,用于命令行调试)。通过以下命令安装:
sudo apt update
sudo apt install gfortran gdb
若需图形化调试工具,还可安装DDT(Data Display Debugger,需单独下载)或通过IDE(如CLion、Eclipse)配置。
2. 编译时添加调试信息
使用gfortran编译Fortran程序时,必须添加**-g**选项,该选项会在生成的可执行文件中嵌入调试信息(如变量名、行号、调用堆栈),使GDB能定位代码中的问题。例如:
gfortran -g my_program.f90 -o my_program
若未添加-g,GDB将无法显示变量值、断点位置等关键信息。
3. 使用GDB进行命令行调试
GDB是Ubuntu下最常用的Fortran调试工具,以下是基本操作流程:
gdb ./my_program,加载可执行文件。break命令指定断点位置,例如:
main子程序开头设置断点:break main;break my_program.f90:42;calculate入口设置断点:break calculate。run(或简写r)启动程序。若程序需要命令行参数(如arg1 arg2),可追加为run arg1 arg2。程序将在断点处暂停。step(或s):进入当前行的子程序(如调用func()时,进入func的内部代码);next(或n):执行下一行代码,不进入子程序(如遇到call func()时,直接执行完该行,不进入func)。print(或p)命令查看变量当前值,例如print x(查看变量x的值)、print array(1:5)(查看数组array的前5个元素)。backtrace(或bt),显示当前函数的调用路径(如main -> func1 -> func2),帮助定位问题发生的上下文。continue(或c),让程序从当前断点继续运行,直到遇到下一个断点或程序结束。quit(或q),退出调试环境。4. 使用Valgrind检查内存问题
Valgrind是内存调试工具,可检测内存泄漏(未释放的动态内存)、数组越界(访问超出数组范围的元素)、非法内存访问(如使用未初始化的指针)等问题。使用方法:
valgrind --leak-check=full ./my_program
--leak-check=full选项会详细显示内存泄漏的位置(如哪一行代码分配了未释放的内存)。常见输出信息:
malloc后未free);5. 使用LLDB进行调试
LLDB是LLVM项目的调试器,功能与GDB类似,适用于调试用gfortran编译的Fortran程序。基本操作:
lldb ./my_program。breakpoint set --name main(在main子程序设置断点)或breakpoint set --file my_program.f90 --line 42(在第42行设置断点)。run。step(进入子程序)、next(跳过子程序)。frame variable x(查看当前栈帧中的变量x的值)。continue。6. 辅助调试技巧
cppcheck或clang-tidy在编译前检查代码中的潜在错误(如未初始化的变量、数组越界、语法问题)。例如:cppcheck --enable=all my_program.f90
write(*,*)语句,输出变量值或程序执行流程(如write(*,*) "x=", x, "at line 10"),帮助跟踪程序运行状态。日志可输出到屏幕或文件(如write(10,*) "x=", x,其中10是文件单元号)。