说明:本文方法适用于所有Linux下使用vs code调试Fortran程序

前提准备

安装了gdb的linux/windows

没有的话ubantu下apt-get 下载一个,一般都自带
window要安装mingw64(注意不要弄错了64位和32位不能通用)


本人所用的是Ubantu 16.04的虚拟机
采用的是mfix-19.3.1

方法

1. 编译你的solver

在终端键入

build_mfixsolver --batch FCFLAGS="-g -O0" -j 4 

完成后会出现一个名为mfixsolver的可执行文件

参数讲解:
–batch 代表只能用命令行方式运行mfix(非GUI),只有这种方式才能才生可执行文件
FCFLAGS 代表传入编译器(未指定默认是gfortran)的参数
-g 代表输出debug信息,这个信息会被gdb所接收
-O0 表示不进行编译优化。只有加上这个参数,语句才会一句一句地按顺序执行,否则你会发现程序的语句是跳着走的,一会儿到这一会儿到那。

2020-9-12补充
之前有人问我为什么这句编译失败了,我当时很疑惑。现在终于发觉了(…抱歉了兄弟)。-j的前面少加了一个空格,于是程序把这个-j当成是前面和语句FCFLAGS="-g -O0"连着的一个命令了。同时提醒下这个-j 4不加也可以,就是并行编译而已,不差这几十秒的事。

2020-10-29补充

新版本的MFiX也可以在GUI里面进行编译batch版本了,只需要选择是否支持interatIve support为none即可,如图
此外,build type 要选择debug
在这里插入图片描述

2. 把你编译的程序装入gdb

gdb mfixsolver

然后终端会进入gdb内部

3. gdb中运行和查看源代码

输入

list或者l

会显示几行源代码

输入

run -f gas_and_solid_Yin.mfx 

会运行程序,其中gas_and_solid_Yin.mfx换成你自己的.mfx的名字

control C无法在这里终止程序
要终止程序,用control+z

gbd的常用使用方法 见
https://www.cnblogs.com/HKUI/p/8955443.html
简单介绍下:
l或者list是显示代码,l 空格 行号会以那一行为中心显示附近10行
打断点是b或者break
继续下一步(进入子程序)是n或者next
继续下一语句(不进入子程序)是s或者step
一般用法就是用l显示源代码,然后在想停住的地方输入b 空格 行号
比如在第十行打断点输入b 10就在第十行前停住

常见错误总结

  1. 如果没有用–batch 编译成纯命令行模式会出现
not in executable format: File format not recognized

这是因为GUI的编译实际上产生的是一个shell文件,里面就一个语句:指向python
可见mfix的GUI是一个套着python壳子的程序

2.如果在gdb中run的时候没有给定参数-f gas_and_solid_Yin.mfx

 **********************************************************************
 From: mfix.f
 Error 1000: Input data file does not exist: mfix.dat
Aborting.
 **********************************************************************

很简单,没指定deck file的名字,自动认定名字为mfix.dat,旧版本的时候只能使用这个名字

进阶:用VS code 可视化gdb

简陋版的gdb调试基本已经能满足大部分需求了
但是不能可视化的打断点,很不方便
借助vs code可以很方便地像Visual studio里那样debug
注:还是要先编译出mfixsolver

1 准备工作:安装插件

下载一个visual studio code

在左侧的扩展选项卡搜索插件

安装名为morden fortran的插件
安装名为C/C++的插件
安装一个名为fortran breakpoint的插件

还可以安装Chinese这个插件,是对VS CODE的汉化
在这里插入图片描述

2 配置launch.json

点左侧边栏的调试按钮,然后点小齿轮,最后点C++(GDB/LLDB)
如图所示
在这里插入图片描述

之后在你的.vscode文件夹会出现launch.json文件(如果配置错了随时可以删除这个文件,再重新操作)
文件内容为

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "输入程序名称,例如 ${workspaceFolder}/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}


“program”: “输入程序名称,例如 ${workspaceFolder}/a.out”,
这一行 第二个引号的位置 替换为你的mfixsolver的位置(完整路径)
比如我的是
/home/cl/MFiX_Cases/git_sync/Yin_0413_git_sync_case/mfixsolver

stopAtEntry可以改为true,意思是进入程序以后先暂停一下
这是改完后的launch.json

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/mfixsolver",
            "args": [],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
2020-10-29补充

直接自己在当前文件夹下面创建名为.vscode文件夹,在里面创建launch.json, 然后自己用文本编辑器把上面的内容复制到过去也行
在这里插入图片描述

3 运行和调试

按F5运行调试
右上角会出现一个调试的小工具框
在这里插入图片描述
单步跳过(F10)的意思就是不进入子程序/函数,
F11就是进入每一个子程序,一句一句运行
跳出就是跳出当前的子程序

打断点的方法
在这里插入图片描述
点击行号左边的空白处,就会出现小红点。就是断点
F5运行到下一断点

错误总结

问题1 报错

有个问题要解决,就是没法指定-f .mfx文件 会报错

 **********************************************************************
 From: mfix.f
 Error 1000: Input data file does not exist: mfix.dat
Aborting.
 **********************************************************************

目前没找到更好的解决方案,但是把.mfx文件改名为mfix.dat就行
毕竟就是个名字,是啥无所谓

问题2 重新启动的时候快速删除

run_type=new的时候不能有任何已经产生的结果,每次都要把文件夹清空一下才能运行

每次启动都要手动删除一堆东西很麻烦,直接用终端代码

rm -r *.RES *.SP* *.pvd *.csv VTK BACKUP_RES *.LOG *.OUT *.TXT *.vtu *.vtp

或者把它定义到~/.bashrc里面
把代码复制到最后一行,然后重启终端,在终端运行

alias mfixclean="rm -r *.RES *.SP* *.pvd *.csv VTK BACKUP_RES *.LOG *.OUT *.TXT *.vtu *.vtp"

这样每次删除只需要运行mfixclean就够了

问题3 无法打断点/运行下一步

主要原因就是没安装fortran breakpoint这个插件

问题4 找不到mfixsolver

vs code只是 将调试可视化的。所以自己还是要先编译一下。

需要自己先在终端里编译一下mfixsolver

build_mfixsolver --batch "FCFLAGS=-g -O0"-j 4 
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐