在 Debian 上调试 Fortran 程序的实用流程
一 环境准备
- 安装编译器与调试器:
- 安装 gfortran(生成含调试符号的可执行文件)与 gdb(命令行调试器)。
- 命令:sudo apt update && sudo apt install -y gfortran gdb
- 说明:gfortran 支持 Fortran 77/90/95/2003 等标准;gdb 可直接调试 Fortran 程序(断点、单步、变量打印、调用栈等)。
二 编译与基本调试步骤
- 编译时务必加入 -g 生成调试信息,避免优化干扰(如 -O0):
- 示例:gfortran -g -O0 -o my_program my_program.f90
- 启动与常用命令(在 gdb 中):
- 启动:gdb ./my_program
- 断点:break main 或 break my_subroutine 或 break file.f90:42
- 运行:run(需要参数时:run arg1 arg2)
- 单步:step(进入函数)/ next(不进入函数)
- 继续:continue
- 打印:print var 或 print array(1:5)
- 调用栈:backtrace(简写 bt)
- 退出:quit
- 小技巧:使用 info breakpoints 管理断点;display var 在每次停顿时自动打印变量。
三 进阶调试技巧
- 条件与观察点:
- 条件断点:break 20 if i > 100
- 观察点:watch x(变量被修改时暂停)
- 源码与显示:
- list 查看上下文;display/undisplay 管理自动打印
- 多线程(如 OpenMP/MPI):
- 查看线程:info threads;切换线程:thread N
- 汇编/寄存器(定位低层问题时):
- x/10i $pc 查看当前指令;info registers 查看寄存器
- 提示:Fortran 数组在 GDB 中支持按索引/切片打印(如 print a(1:10))。
四 崩溃分析与内存问题
- Core Dump 定位崩溃现场:
- 开启 core:ulimit -c unlimited
- 运行程序直至崩溃,生成 core 文件(如 core 或 core.pid)
- 调试:gdb ./my_program core(或 gdb ./my_program core.pid),使用 bt 查看崩溃点,print 检查变量
- 内存错误与泄漏检测(Valgrind,适合定位越界/未初始化/泄漏等):
- 安装:sudo apt install -y valgrind
- 使用:valgrind --leak-check=full ./my_program
- 说明:Valgrind 对 Fortran 有效,能报告非法访问与内存泄漏细节。
五 可选 图形化调试与常见排错
- VSCode + GDB(适合新手可视化调试):
- 安装 VS Code 与扩展(如 Modern Fortran)
- 配置 .vscode/launch.json(type: cppdbg, MIMode: gdb, program 指向可执行文件)
- 配置 .vscode/tasks.json(编译任务使用 gfortran -g -O0)
- F5 启动调试,支持断点、变量、调用栈可视化
- 常见排错清单:
- 断点无法命中:确认编译时使用了 -g,且未用 strip 去除符号;路径/行号变更后请重新编译
- 变量“看不见”或类型不符:用 whatis/info locals 检查;Fortran 的哑元参数与模块变量需正确编译进符号表
- 优化干扰:调试阶段使用 -O0;发布时再恢复优化级别。