想要在 VSCode 里调试,需要配置两个文件 tasks.json 和 launch.json 。
这两个桐困游文件按 F5 后会自动在 .vscode 目录下生成。
一般默认生成的 tasks.json 文件如下:
我们需要关注的选项有:
深入理解 tasks.json 文件的作用与 "command" 选项的用法,我们就能灵活地配置构建工程。
tasks.json 文件是用来构建工程的,当我们按 F5 进行调试时,VSCode 首先会执行 tasks.json 文件里 "command" 选项后的命尺基令,并传入 "args" 参数,这样整个工程就被重新编译链接一遍了。
以 hello.c 文件和上述 tasks.json 为例,按 F5 进行调试时,最终会在命令行执行下述命令构建工程:
当然,如果一个工程有多个文件,"command" 就不能是简单的 gcc 了,需要根据实际的构建系统选择。
如果构建系统使用的是 Makefile ,那我们可以配置
这样在构建项目时就会使用命令
这跟我们平时使用 make 构建项目是一致的。
又比如配置 Zephyr 环境,
这样在构建项目时相当于执行命令
launch.json 文件用于配置调试环境。一般默认生成的文件如下:
我们需要关注的选项有:
VSCode 预定义了一些变量,可以在 Variables Reference 查看意思。
有时候我们的程序需要访问硬件资源,这一般需要 root 权限,而 VSCode 一般是在用户权限下启动的,这就需要特殊配置 VSCode 才能调试程序。
下面介绍如何利用 VSCode 以 root 权限调试程序。
首先需要注意到 launch.json 文件里的 "miDebuggerPath" 这个选项,它是调试器的路径,如果这个调试器可以以 root 权限运行,那么就达局销成了我们的目的了。
在 /home/user_name 目录下创建文件 gdb,user_name 需要替换为实际的用户名。
然后编辑该文件 vim gdb ,加入下述内容:
给 gdb 添加执行权限,
在修改 "miDebuggerPath" 成为
即可。这样我们就可以在 VSCode 里以 root 权限调试程序了,只不过每次都需要输入密码,因为有一个 sudo 过程。
为了解决这个麻烦,我又在网上找到了方法,将 /home/user_name/gdb 加入 sudo 的免密认证即可。
输入
编辑 /etc/sudoers 文件,修改成下述内容即可,
其中 jackis 是我的用户名,需要根据实际用户名替换。
NOPASSWD: 后的命令 sudo 时都不需要密码。退出 Shell,再重新打开一个命令行界面,输入 sudo apt update ,会发现没有提示输入密码了。
参考:
How to debug programs with “sudo” in VSCODE
How to Run sudo Commands Without Password
1、打开你要写c++程序的文件夹,我们这禅销毕里新建一个Test文件夹并打开test,打开后:使用VScode运行调试C/C++,在左侧打开的目录中新建一个 main.cpp 文件。
2、新建后点左侧的调试按钮(英文:Debug),可以看到,目前没有调试配置。
3、这时我们需要配置自己的调试配置,回到资源管理器界面,我们可以看到目录下多了一个.vscode的文件夹,里面有一个launch.json文件。我们现在在这个文件夹中新建一个斗银tasks.json文件。我们需要改写这两个json文件的内容。
{
version: 0.2.0,
configurations: [
{
name: Run C/C++,
type: cppdbg,
request: launch,
program: ${workspaceFolder}/${fileBasenameNoExtension}.exe,
args: [],
stopAtEntry: false,
cwd: ${workspaceFolder},
environment: [],
externalConsole: true,
MIMode: gdb,
miDebuggerPath: C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/bin/gdb.exe,
setupCommands: [
{
description: Enable pretty-printing for gdb,
text: -enable-pretty-printing,
ignoreFailures: false
}
],
preLaunchTask: build &run file
},
{
name: Debug C/C++,
type: cppdbg,
request: launch,
program: ${workspaceFolder}/${fileBasenameNoExtension}.exe,
args: [],
stopAtEntry: false,
cwd: ${workspaceFolder},
environment: [],
externalConsole: true,
MIMode: gdb,
miDebuggerPath: C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/bin/gdb.exe,
setupCommands: [
{
description: Enable pretty-printing for gdb,
text: -enable-pretty-printing,
贺芹ignoreFailures: false
}
],
preLaunchTask: build &debug file
}
]
}
其中tasks.json文件内容(直接复制即可):
{
version: 2.0.0,
tasks: [
{
label: build &debug file,
type: shell,
command: g++,
args: [
-g,
-o,
${fileBasenameNoExtension},
${file}
],
group: {
kind: build,
isDefault: true
}
},
{
label: build &run file,
type: shell,
command: g++,
args: [
-o,
${fileBasenameNoExtension},
${file}
],
group: {
kind: build,
isDefault: true
}
}
]
}
4、我们已经完成了基本的配置工作,保存以上两个json文件后,再次点击左侧的调试按钮(Debug),可以发现出现了两个新的配置,一个是直接运行程序的Run,一个是用来调试程序的Debug。
5、我们写一个简单的c++程序来进行调试说明,程序源代码,我们在return 0这行添加了一个断点。
6、切换运行配置为Debug C/C++,点击运行按钮开始调试。
7、可以看到,d出的终端输出了正确的结果,调试窗口中的变量中也有变量a和对应的值。
使用 VSCode 调试 Node.js 的告信时候,
遇到 child_process 中的断点,是跟不进去的。
(1)目录结构
打开 VSCode,并以 main 作为根目录,
(2)app.js
(3)child/process.js
(4).vscode/launch.json
main 项目中按 F5 ,程序会停在 app.js 中的断点处,单步调试,
然后,调试进程就结束了。并不会跑到第 6 行的断点处,
child/process.js 中的断点,也跑不进去,
以激游上示例中,我们发现 VSCode 无法调试到 child_process 中。
也不确定 VSCode 未来是否会支持。
当前我们可以通过 Debug 的 Attach 方式,对 child_process 进行调试。
我们需要另一个 VSCode 实例来 Attach,两个 VSCode 一起使用。
main 项目的 .vscode/launch.json 启动 main/app.js
attach 项目的 .vscode/launch.json attach 到 child_process
目录结构分别如下,
为了能 attach 成功,我们需要同步修改 main/app.js 与 attach/.vscode/launch.json,
调试端口号可以任选,不一定的 9001 ,但应保持一致。
(1)main/app.js
(2)attach/.vscode/launch.json
(1)启动 main 项目
(2)debug attach 项目
attach 项目中按 F5 ,VSCode 会 attach 到已经启动的子进程上,
(1)main 项目,按 F5 启动调试
main 项目单步调试,
这时子进程已经启动了,切换到 attach 项目启动调试。
(2)attach 项目,按 F5 启动调试
attach 项目单步调试,
(3)main 项目 child.send
main 项目单步调试,断点直接跑到了 attach 项目中,
attach 项目单步明友销调试,断点又回到 main 项目,
Debugging in Visual Studio Code
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)