自从我将系统升级到Monterey,vscode就变了,这个配置不能Debug了,心痛之余,我找到了另外的解决方案:vscode 插件 CodeLLDB。一些同学可能不知道什么是LLDB,我在这里进行了简短总结,可以看一下。
下面讲一下怎么使用CodeLLDB.
第一步,扩展程序搜索并安装CodeLLDB.
第二步,编写一个test.cpp,打上断点调试,大概率调试是不通过的,可能会安装CodeLLDB需要的package,等他装好,然后会跳出launch.json,在launch.json中加入以下代码:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "clang++ - 生成和调试活动文件",
"type": "lldb",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.out",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "lldb",
"preLaunchTask": "C/C++: clang++ 生成活动文件"
}
]
}
以上文件中这几个选项比较重要:
第三步,保存之后重新调试,这时会发现系统自动生成了task.json。至此就可以开始调试了。
第四步,在.vscode文件夹下创建settings.json文件,设置files.exclude选项。
以上配置完成之后会发现一个问题:生成的可执行文件默认是没有后缀的,这样就无法通过files.exclude隐藏,目录里会出现很多可执行文件。
解决办法:
想要解决,就要搞清可执行文件是在哪里产生的,以及在哪里使用的。在编译之后会产生可执行文件,在链接阶段要使用到可执行文件。在我们的配置中:
有两个地方进行编译:
第一,运行前会编译。可通过在setttings.json文件夹设置code-runner.excutorMap选项解决;
第二,调试前会编译。可通过在task.json中设置任务执行方式进行改变。
有一个地方会使用:在我们启动调试后的链接。可通过在lanuch.json中设置链接文件格式解决,如果不做设置,在链接文件的时候会出现找不到文件的情况。
设置之后的三个文件如下,可以直接复制粘贴:
settings.json
{
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true,
"**/Thumbs.db": true,
"**/*.dSYM":true,
"**/*.out":true,
},
//code-runner settings===================================================================================================
"code-runner.executorMap": {
"cpp": "clang++ $dir$fileName -o $fileNameWithoutExt.out -g -std=c++17 && $dir$fileNameWithoutExt.out",
}
}
task.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: clang++ 生成活动文件",
"command": "/usr/bin/clang++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.out",
"-std=c++17",
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
lanuch.json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "clang++ - 生成和调试活动文件",
"type": "lldb",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.out",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "lldb",
"preLaunchTask": "C/C++: clang++ 生成活动文件"
}
]
}
详细说来,其实相比于最初的配置文件,更改的只有三个地方:
1.settings.json中增加以下代码,使得在运行的时候使用clang++、c++11并产生有.out的可执行文件,同时执行可执行文件。
//code-runner settings==========================
"code-runner.executorMap": {
"cpp": "clang++ $dir$fileName -o $fileNameWithoutExt.out -g -std=c++17 && $dir$fileNameWithoutExt.out",
}
其中-o参数是为了为可执行文件命名,-g参数是避免编译器优化,为了方便调试。
2.tasks.json中修改以下选项,在最后加上.out,这样产生的可执行文件就会带.out后缀。
tasks -> args -> "${fileDirname}/${fileBasenameNoExtension}.out"
3.launch.json中修改以下选项,在最后加上.out,这样链接的时候就回去找带.out后缀的可执行文件。
configurations -> program -> "${fileDirname}/${fileBasenameNoExtension}.out"