• 【读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
    ```

  • 相关阅读:
    微信小程序之base64转为本地图片
    微信小程序之页面跳转方法
    一些收集的社区网址+学习网站、文档
    11-DOM介绍
    10-关于DOM的事件操作
    09-伪数组 arguments
    前端---css
    前端---html
    并发编程------网络IO模型、IO多路复用
    并发编程------协程
  • 原文地址:https://www.cnblogs.com/chunleili/p/gdb_debug_MFiX.html
Copyright © 2020-2023  润新知