• 【读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 
    
  • 相关阅读:
    禅道开源版本安装
    NATAPP内网穿透实现
    nginx部署前端项目
    docker-compose部署微服务
    python编写猜数字游戏
    Linux命令(用户管理、组和时间管理)
    Linux命令(文本编辑器)
    Linux的简单命令(防火墙篇)
    什么是泛型
    spring bean 的作用域之间有什么区别
  • 原文地址:https://www.cnblogs.com/chunleili/p/12758186.html
Copyright © 2020-2023  润新知