今天在调试mintty时,命令行参数始终多了几个参数2>CON 1>CON <CON。由于mintty是运行在MSYS环境的而不是运行在MinGW环境的,所以编译、调试都需要使用MSYS环境的编译器和调试器。

VSCode中添加MinGW64终端可以在settings.json中的terminal.integrated.profiles.windows中添加

1"MinGW64": {
2      "path": "G:\\msys64\\usr\\bin\\bash.exe",
3      "args": ["--login", "-i"],
4      "env": {
5        "MSYSTEM": "MinGW64",
6        "CHERE_INVOKING": "1",
7        "MSYS2_PATH_TYPE": "inherit"
8      }
9    }

下面是terminal.integrated.profiles.windows的完整配置

 1"terminal.integrated.profiles.windows": {
 2    "PowerShell": {
 3      "source": "PowerShell",
 4      "icon": "terminal-powershell",
 5    },
 6    "Command Prompt": {
 7      "path": [
 8        "${env:windir}\\Sysnative\\cmd.exe",
 9        "${env:windir}\\System32\\cmd.exe"
10      ],
11      "args": ["/K chcp 65001 >nul"],
12      "icon": "terminal-cmd"
13    },
14    "Git Bash": {
15      "source": "Git Bash"
16    },
17    "MinGW64": {
18      "path": "G:\\msys64\\usr\\bin\\bash.exe",
19      "args": ["--login", "-i"],
20      "env": {
21        "MSYSTEM": "MinGW64",
22        "CHERE_INVOKING": "1",
23        "MSYS2_PATH_TYPE": "inherit"
24      }
25    },
26    "MSYS": {
27      "path": "G:\\msys64\\usr\\bin\\bash.exe",
28      "args": ["--login", "-i"],
29      "env": {
30        "MSYSTEM": "MSYS",
31        "CHERE_INVOKING": "1",
32        "MSYS2_PATH_TYPE": "inherit"
33      }
34    },
35  },

然后使用make DEBUG=1编译调试版本。

使用默认配置launch.json,修改programmiDebuggerPath调试:

 1{
 2	// 使用 IntelliSense 了解相关属性。
 3	// 悬停以查看现有属性的描述。
 4	// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
 5	"version": "0.2.0",
 6	"configurations": [
 7		{
 8			"name": "(gdb) 启动",
 9			"type": "cppdbg",
10			"request": "launch",
11			"program": "${workspaceFolder}/bin/msys64/mintty.exe",
12			"stopAtEntry": false,
13			"cwd": "${workspaceFolder}",
14			"environment": [],
15			"externalConsole": false,
16			"MIMode": "gdb",
17			"miDebuggerPath": "G:/msys64/usr/bin/gdb.exe",
18		}
19	]
20}

发现命令行参数多了3个参数:2>CON1>CON<CON

但是VSCode下使用MinGW64gdb调试是正常的(mintty依赖MSYS,不能使用MinGW64中的gdb调试,笔者是使用的一个不依赖MSYS的简单demo测试的),只要使用/usr/bin/gdb.exe就会有这个问题。

原来是launch.jsonexternalConsole参数的问题,将之改为true,即使用外部终端就正常了。