【读MFiX源代码】番外:如何利用gdb调试mfix程序?并且用Visual studio code将debug可视化

前提准备

安装了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 表示不进行编译优化。只有加上这个参数,语句才会一句一句地按顺序执行,否则你会发现程序的语句是跳着走的,一会儿到这一会儿到那。

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

常见错误总结

  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
                }
            ]
        }
    ]
}

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 
posted @ 2020-04-21 01:10  北斗123  阅读(747)  评论(0编辑  收藏  举报