文章目录
前提准备
安装了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
常见错误总结
- 如果没有用–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