使用VSCode的Native Debug进行程序调试

2022-05-05 647阅读

温馨提示:这篇文章已超过729天没有更新,请注意相关的内容是否还可用!

VSCode有一个扩展叫Native Debug,很方便程序调试,本文讲述如何使用这个扩展,以C/C++为例。

运行环境是Win10,编译器是mingw gcc 9.2.0,需要事先安装好。


一 安装Native Debug

在VSCode的扩展里搜索native,找到Native Debug,然后安装,

在这里插入图片描述


二 创建demo工程

先创建一个空文件夹,然后使用VSCode打开这个文件夹。接着使用CMake去创建demo工程,需要先安装CMake,并在VSCode里安装CMake扩展,即红框里的这2个,

在这里插入图片描述 

ctrl+shift+p调出命令面板,然后输入cmake,找到Quick Start,然后简单选择下就行了,

在这里插入图片描述 

最后创建的工程如下,

在这里插入图片描述

因为有了cmake加持,所以按下F7就可以进行自动配置和编译,生成的可执行文件在build目录下,名字为demo.exe

因为要调试,所以要修改一下CMakeLists.txt,如下,加上第7和第8行,这样在编译的时候就可以打开调试开关,

cmake_minimum_required(VERSION 3.0.0)
project(demo VERSION 0.1.0)

include(CTest)
enable_testing()

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g") 

add_executable(demo main.cpp)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

三 调试

1. 基本操作

先切到VSCode的debug窗口,第一次使用Native Debug时,点击红框里的create a launch.json file,

弹出如下界面,选择GDB

然后就会自动给这个demo工程添加一个launch.json文件,在.vscode目录下,其默认内容如下,

这里只需要修改下target就行了,cwd表示调试时的当前路径,默认是工程的根目录,target改为如下,即生成的可执行文件的路径,

"target": "./build/demo.exe",

然后打开main.cpp,改为如下,

#include <iostream>


void modifyFunc(int *dataPtr)
{
if (dataPtr != nullptr)
{
*dataPtr += 200;
}
}

int main(int, char**) {

int data = 100;

modifyFunc(&data);

std::cout << "new data is " << data << "\n";

return 0;
}

然后按F7重新编译,OK后在第14行打上断点,断点要先打,不然开启debug时就执行运行到最后了。

在这里插入图片描述

接着点击Debug对应的绿色三角,

在这里插入图片描述

最后界面变成如下,程序停在了断点处,左侧有四个窗口:VARIABLES可以查看当前被执行函数里的局部变量;WATCH窗口可以查看用户添加的变量;CALL STACK就是查看调用栈,也就是当前的函数调用关系;最后是BREAKPOINTS,查看断点

在这里插入图片描述


调试时的单步,continue等就是点击中间的那8个按钮,都是非常方便的,

如果对gdb的命令比较熟悉,想在gdb的控制台进行操作,那么就点开下方的DEBUG CONSOLE,最下方的白色大于号就是输入gdb命令的,

在这里插入图片描述

这里输入info b查看一下断点信息,

在这里插入图片描述

如果想在WATCH窗口中观察某个变量,找到并选中这个变量,右击,选择Add to Watch,然后就能在WACH窗口中看到这个变量了,

如下,

在这里插入图片描述

还有Run to Cursor和Jump to Cursor等快捷选项。

2. 传递命令行参数

有时候程序运行时有命令行参数,那么此时在launch.json里重新添加一个配置,名字叫Debug_args,如下,和之前的配置并列,

{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Debug",
"type": "gdb",
"request": "launch",
"target": "./build/demo.exe",
"cwd": "${workspaceRoot}",
"valuesFormatting": "parseText"
},
{
"name": "Debug_args",
"type": "gdb",
"request": "launch",
"target": "./build/demo.exe",
"arguments": "123 456",
"cwd": "${workspaceRoot}",
"valuesFormatting": "parseText"
}
]
}

新的配置里加入了"arguments",其值就是需要的命令行参数,由用户自己填写,这样在启动这个调试配置时就会把参数传给程序。

保存launch.json后,在Run and Debug的下拉框里就能看到新加的调试配置了,即Debug_args,

在这里插入图片描述

选中Debug_args,然后点击左侧的绿色三角启动调试,接着程序会停在断点处,

此时观察左侧的VARIABLE窗口,在Local下,可以看到argc和argv的值,和设置的一样,

在这里插入图片描述


三 总结

可以看出Native Debug非常好用,主要是帮我们自动生成launch.json,用户简单改下就可以用了,配合CMake就更上一层楼,当然没有CMake也没问题,只要设置好可执行文件的位置就行了。

在Win和Linux下都可以使用,特别是在Linux下,比传统的gdb,cgdb还有gdb tui都好用多了。支持GDB/LLVM等,本文只介绍了基本的使用方法,还有一些其它功能,如远程调试,可以自行探索。