Home VSCode+GDB远程调试
Post
Cancel

VSCode+GDB远程调试

在VSCode中,支持使用GDB调试器,可以以图形界面远程调试linux环境的程序。用户通过在图形界面操作,由VSCode代为操作GDB,比较直观, 同时也支持用户输入gdb调试指令。

前置条件

  1. 在linux系统中安装gdb调试器。sudo apt install gdb。准备好待调试的程序。
  2. 在VS Code中安装C/C++扩展,点击侧边栏中的扩展图标,搜索”C/C++”,然后选择”C/C++”扩展进行安装。

远程后本地调试

在VSCode中安装查件“Remote-SSH”,远程登录到linux目标机器,直接在目标机器上编译和调试。可以配饰ssh客户端配置文件,添加主机。编辑~/.ssh/config文件,添加目标机器。

example:

1
2
3
4
5
Host debian
  HostName 172.16.1.96
  Port 22
  User prejoy
  IdentityFile ~/.ssh/id_rsa

在vscode中创建好工程,编译debug版本的程序,侧边栏选择“Run and Debug”,(没有就创建一个launch.json), 然后在.vscode/launch.json中添加配置,选择 “C/C++(gdb) Launch”,根据情况调整,参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
  "version": "0.2.0",
  "configurations": [
    {
        "name": "debug-myapp",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/myapp/myapp",
        "args": [],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}/myapp",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "miDebuggerPath": "/usr/bin/gdb",
        "setupCommands": [
            {
                "description": "为 gdb 启用整齐打印",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
            }
        ],
        "preLaunchTask": ""
    }
  ]
}

随后,选择对应的配置启动调试。

远程后远程调试(真远程)

适用于开发环境和运行环境不是同一台设备的情况。需要在运行环境使用gdbserver。

(1) vscode中,先在使用“remote-ssh”连接到开发环境,建立好工程,并编译完成。

(2) 需要将生成的可执行文件传输到运行环境。位置随意,然后在运行环境中使用gdbserver准备对程序调试, 如gdbserver :5050 ./myapp [arg list...],在所有地址的5050端口上侦听。如果程序需要启动参数,写在后面即可。

(3) 在开发环境的vscode中,在.vscode/launch.json中添加配置,选择 “C/C++(gdb) Launch”,主要是添加了 "miDebuggerServerAddress": "192.168.254.180:5050", 字段以连接远端服务器。参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
  "version": "0.2.0",
  "configurations": [
    {
        "name": "remote debug myapp",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/myapp/myapp",
        "args": [],
        "stopAtEntry": true,
        "cwd": "${workspaceFolder}/myapp",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "miDebuggerPath": "/usr/bin/gdb",
        "miDebuggerServerAddress": "192.168.254.180:5050",
        "setupCommands": [
            {
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
            },
            {
                "description": "Set Disassembly Flavor to Intel",
                "text": "-gdb-set disassembly-flavor intel",
                "ignoreFailures": true
            }
        ],
        "preLaunchTask": ""
    },
  ]
}

进入调试页面,启动调试,在VsCode的Debug界面, 有栈变量信息,watch信息,栈信息,线程信息,断点信息,各个单步调试按钮,右键菜单有更多选项可以用于调试。

注意,被调试的程序在运行环境中需要满足基本运行条件,如依赖的动态共享库需要全部存在于动态库加载路径中等,因为编译环境和运行环境可能有差异,需要注意。 另外一点,被调试程序需要和vscode中准备调试的程序是同一个,在更新程序后,编译后,不要忘记同步到运行环境中。可以使用配置中的preLaunchTask字段, 设置运行前置任务,通过脚本,完成编译更新和远程同步的工作。

vscode中使用gdb指令

启动调试后,vscode支持用户输入gdb指令。

选择底部的“DEBUG CONSOLE”栏,可以在里面输入信息,本身是用来和vscode的调试功能交互的,对于GDB调试器,vscode支持执行gdb指令, 只需输入 -exec <gdb cmd>即可执行gdb指令,比较方便。这里的-exec是不能省略的,表示将后面的命令传送给GDB调试器,因为接收指令的解析器还不是GDB, 所以需要使用-exec表明功能。

更多参考

VSCode Debugging

Configure C/C++ debugging

Debug C++ in Visual Studio Code

This post is licensed under CC BY 4.0 by the author.

linux lspci 工具

内核模块概要