工作中碰到一个问题,在与上位机qt界面联调过程中要看很多入口,出口变量的值,并且公司的VScode没配gdb。(既然界面没用调试,之前是如何debug的呢?答案是手动输gdb指令,或手动断点,之前找段错误问题就写一个 while(1)让程序卡死在某地方达到手动打断的效果),但这次问题太多,手动一个个 printf这也太不优雅了吧。我实在受不鸟了,从网上学习了一下,在VScode上使用gdb调试。

launch.json

choose Run > Add Configuration... and then choose C++ (GDB/LLDB).
配置如下:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "`${workspaceFolder}/build/vdj_hil_simulator`",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/build",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "vdj build", //与tasks.json 的label项目同名
            "miDebuggerPath": "${workspaceFolder}/gdb_sudo.sh"
        }
    ]
}

因为项目用到了多线程,所以需要管理员权限才能正常启动程序,否则无法创建线程。而vscode默认不是用管理员执行gdb的。解决权限的方法很简单。新建一个gdb_sudo.sh文件,里面填入如下文本。

#!/bin/sh
sudo /usr/bin/gdb "$@"

gdb_sudo.sh对应miDebuggerPath的路径。使用此方法需要保证执行sudo不需要密码。具体方法我就不介绍了。

tasks.json

添加tasks.json并修改内容如下:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "vdj build"", //编译项目
            "type": "shell",
            "command": "cd ./build ;cmake .. ;make", //编译命令
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

其他问题

如果点击debug还是没有反应,请检查gdb_sudo.sh有没有运行权限。
终端输入ls可列出当前目录下文件。可执行文件的高亮与普通不一样,我这里是绿色

如果没有执行权限,输入以下命令获取运行权限

chmod +x gdb_sudo.sh

在windows下编辑后,或git下载后导入linux也可能会无法执行,这是因为linux与window换行符不一致,linux解析脚本错误导致的。需要在在终端输入以下命令将换行符号替换一下修复。

sed -i 's/\r//g' gdb_sudo.sh
最后修改:2023 年 11 月 26 日 07 : 02 PM
赏口饭吃,行行好吧,客官!