zoukankan      html  css  js  c++  java
  • 【读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
    ```

  • 相关阅读:
    Chapter 03Using SingleRow Functions to Customize Output(03)
    Chapter 03Using SingleRow Functions to Customize Output(01)
    Chapter 04Using Conversion Functions and Conditional ExpressionsNesting Functions
    Chapter 04Using Conversion Functions and Conditional ExpressionsGeneral Functions
    Chapter 11Creating Other Schema Objects Index
    传奇程序员John Carmack 访谈实录 (zz.is2120)
    保持简单纪念丹尼斯里奇(Dennis Ritchie) (zz.is2120.BG57IV3)
    王江民:传奇一生 (zz.is2120)
    2011台湾游日月潭
    2011台湾游星云大师的佛光寺
  • 原文地址:https://www.cnblogs.com/chunleili/p/gdb_debug_MFiX.html
Copyright © 2011-2022 走看看