VSCode Fortran MPI开发调试环境配置

当前并没有充分支持Fortran+MPI的现代IDE,但借助vscode的灵活性(a.k.a. 简陋)还是可以获得比较好的Fortran开发体验的。

安装插件

upload successful
upload successful

这里推荐使用FORTRAN IntelliSenseModern Fortran两个插件,前者主要能够提供查看定义的功能,后者主要提供调试和代码补全的功能。FORTRAN IntelliSense还需要一个外部的Fortran Language Server,用pip就可以很轻松的安装上。

1
pip install fortran-language-server

配置插件

upload successful
upload successful

打开File->Preferences->Settings,搜索Fortran,需要配置的地方通常有Fortran: Gfortran Executable,这里可以输入编译器的路径或者名字。比如我使用的是PGI编译器,就填入pgfortran即可。也可以在这个设置里修改Include Paths

配置编译Tasks

upload successful
upload successful

按下Ctrl+Shift+P,输入tasks,选择Tasks: Configure Default Build Task,然后看到类似如下的json配置。

1
2
3
4
5
6
7
8
9
10
{
"label": "build",
"type": "shell",
"command": "make -j20",
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
},

label取一个build就可以了,这个名字后面要用到。command配置为编译这个项目的命令就可以了,我的makefile放在项目的根目录里,所以直接运行make -j20就可以编译了。

配置GDB调试

upload successful
upload successful

点击最左边带一只bug的图标,然后点击create a launch.json file,接着选C++ (GDB/LLDB),这里Fortran可以和C++共用GDB的配置,完事之后可以看到类似如下的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/main",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "${workspaceFolder}/scripts/gdbwarp",
"preLaunchTask": "build",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}

要修改的地方首先有program${workspaceFolder}指项目根目录的路径,main是我编译出来的可执行文件的名字。也就是说我的可执行文件就会出现在根目录里。这里不同的项目可能会有不同的配置。

另外一个要改的地方是miDebuggerPath,这里本来应该填的是gdb的路径,或者gdb这个词。但调试MPI的程序肯定不能直接gdb ./main。通常启动gdb的命令是mpirun -np 1 gdb ./main : -np 15 ./main,所以我写了一个叫gdbwarp的脚本,放在项目的scripts文件夹里。脚本的内容如下。

最后要改的地方是preLaunchTask,这个会让在运行调试前启动labelbuild的task,这就是实现了运行调试前自动编译的效果。

1
2
3
4
#!/bin/bash

ROOT=$(dirname $(readlink -f "$0"))/..
mpirun -np 1 gdb $@ : -np 15 $ROOT/main

$(dirname $(readlink -f "$0"))这个变量是获取脚本文件所在的绝对路径,因为gdbwarp根目录/script文件夹里,所以$ROOT变量是指项目的根目录。$ROOT/main就是我的可执行文件。而$@变量会接收来自vscode的参数。

启动调试

按下F5即可启动调试,记得添加断点。最终效果如下。

upload successful
upload successful