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

@[TOC]
## 前提准备
安装了gdb的linux/windows

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

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

## 方法
### 1. 编译你的solver

在终端键入
```bash
build_mfixsolver --batch "FCFLAGS=-g -O0"-j 4
```
完成后会出现一个名为mfixsolver的可执行文件

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

### 2. 把你编译的程序装入gdb
```bash
gdb mfixsolver
```
然后终端会进入gdb内部

### 3. gdb中运行和查看源代码
输入
```bash
list或者l
```
会显示几行源代码

输入
```bash
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](https://www.cnblogs.com/HKUI/p/8955443.html)


## 常见错误总结
1. 如果没有用--batch 编译成纯命令行模式会出现

```shell
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的汉化
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200421151000815.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MDMxNA==,size_16,color_FFFFFF,t_70)


### 2 配置launch.json
点左侧边栏的调试按钮,然后点小齿轮,最后点C++(GDB/LLDB)
如图所示
![在这里插入图片描述](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy84NDY1NzMxLTBiNzdmNjIwNjE4Y2JhZmMucG5n?x-oss-process=image/format,png)

==之后在你的.vscode文件夹会出现launch.json文件(如果配置错了随时可以删除这个文件,再重新操作)==
文件内容为
```javascript
{
// 使用 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

```javascript
{
// 使用 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运行调试
右上角会出现一个调试的小工具框
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200421003230396.png)
单步跳过(F10)的意思就是不进入子程序/函数,
F11就是进入每一个子程序,一句一句运行
跳出就是跳出当前的子程序


打断点的方法
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200421150520249.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MDMxNA==,size_16,color_FFFFFF,t_70)
点击行号左边的空白处,就会出现小红点。就是断点
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
```bash
build_mfixsolver --batch "FCFLAGS=-g -O0"-j 4
```

原文地址:https://www.cnblogs.com/chunleili/p/gdb_debug_MFiX.html