本文目的是在Ubuntu系统使用gdb调试程序的基础上,练习使用可视化调试前端软件VScode调试程序。
目录
- (一)安装并配置VScode
- 1.安装VScode
- 2.配置VScode编译C/C++的环境
- 3.配置VScode调试C/C++的环境
- (二)使用VScode进行程序的调试
- 1.调试程序
- 2.启动调试
- 3.修改程序
- (三)总结
(一)安装并配置VScode
1.安装VScode
- 方法一
直接在Ubuntu系统自带的Ubuntu软件
安装Visual Studio Code - 方法二
命令行安装Visual Studio Code
- 下载:从vscode官网下载最新版本,deb包下载地址:https://code.visualstudio.com/docs?dv=linux64
使用wget 下载地址
进行下载 - 安装:
dpkg -i 安装包
参考博文: 1
- 安装好VScode后如图所示
2.配置VScode编译C/C++的环境
- 安装C/C++插件
在VScode的左边扩展(Ctrl+Shift+X)处搜索C/C++并安装它(我这里已经安装好了C/C++)。 - 安装Chinese (Simplified) Language Pack for Visual Studio Code插件
这个插件可以使VScode显示简体中文,方便使用
3.配置VScode调试C/C++的环境
- 首先,新建vscode_program文件夹作为VScode的工作目录。(注意文件路径和文件名不能有中文,否则会报错。)
- 在VScode中打开该文件夹(即工作目录)并新建子文件夹test存放编写的程序和生成的可执行文件,然后再新建一个C语言程序RevertNum.c。
- 配置程序调试环境
- 首先启动调试(F5)
- 然后选择环境
- 最后选择配置
- 报错如下:
- 从图中可以看出生成的可执行文件的路径为
./vscode_program/RevertNum
而不是./vscode_program/test/RevertNum
。 - 原因如下:
由于tasks.json中的命令type类型为cppbuild时会使编译以进程运行而不是以shell命令运行,因此type配置为cppbuild将会生成的文件放到根目录(工作目录)下,而改为shell会生成到当前目录下。
- 继续调试程序,程序正常运行
- 若想要调试程序时显示外部窗口则需要将 launch.json中的externalConsole属性改为true,显示效果如下:
- 此时发现输出中有多余的类似
[1] + Done "/usr/bin/gdb" --interpreter=mi --tty=${DbgTerm} 0<"/tmp/Microsoft-MIEngine-In-36xb7mwq.voj" 1>"/tmp/Microsoft-MIEngine-Out-t93wyo8f.xxh"
的内容输出,查阅网上资料2说这是正常的输出信息,忽略即可。 - 此时终端输出如下警告:
如果想要去掉该警告,则需在tasks.json中修改presentation的属性panel为new即可解决3。
- 修改的launch.json文件和tasks.json文件4
- launch.json文件修改如下:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gcc - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false, //是否显示外部调试窗口
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: gcc build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
- tasks.json文件修改如下:
{
"tasks": [
{
"type": "shell", 配置为cppbuild将会生成的文件放到根目录下,而改为shell会生成到当前目录下
"label": "C/C++: gcc build active file",
"command": "/usr/bin/gcc",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "/usr/bin"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Generated task by Debugger",
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "new", //这里shared表示共享,改成new之后每个进程创建新的端口
"showReuseMessage": true,
"clear": true
}
}
],
"version": "2.0.0"
}
(二)使用VScode进行程序的调试
1.调试程序
- RevertNum.c
#include<stdio.h>
// 函数作用:输出反转的数
void ShowRevertNum(int Num)
{
while(Num>10)
{
printf("%d",Num%10);
Num/=10;
}
printf("%d\n",Num);
}
int main()
{
int n;
printf("Please input a number:");
scanf("%d",&n);
printf("After Revert:");
ShowRevertNum(n);
return 0;
}
- 程序运行时的问题
当程序输入100时输出为010,正确输出应为001。运行结果如下:
2.启动调试
- 添加断点
- 将鼠标放在程序所在行的左边即可看见暗红色的小圆点,单击它即可设置断点。
- 设置如下三个断点
- 开始调试
利用上方的继续、单步跳过、单步调试、单步跳出等可视化方式调试该程序。
- 当程序停在第一个断点时,Num的值为100
- 当经过一轮while循环后Num的值变为10,此时Num>10不成立直接跳过while循环。
- 到达第三个断点时,直接输出Num的值,此时Num值为10。
- 调试结束
3.修改程序
将RevertNum.c中的while循环中判断条件改为Num>=10即可。成功运行如下:
(三)总结
之前直接使用gdb进行C程序的调试中让我从底层了解了gdb调试程序的过程,而使用VScode调试程序则让我从更高的层次调试程序,工作效率有了显著提升;通过可视化的调试软件,可以不用再去记忆复杂繁多的调试命令,而是直接使用鼠标可视化操作进行程序的相关调试,极大地提高了生产力。
感谢以下博客和文章对我的帮助: