使用VsCode进行C++远程调试

13

我已经将gdbserver附加到一个进程上,在远程机器上正常工作,端口为9999。在我的本地机器上,从命令行输入:

$ gdb
(gdb) target remote localhost:9999

运行得很好。我正在尝试配置Vs Code调试器,以便我可以在这种情况下拥有GDB前端。这是我的启动JSON。

"version": "0.2.0",
"configurations": [
    {
        "name": "GDB",
        "type": "cppdbg",
        "request": "attach",
        "miDebuggerServerAddress": "localhost:9999",
        "program": "path-to-cross-compiled-binary-with-same-debug-symbols",
        "linux": {
            "MIMode": "gdb",
        },
    }
]

这里有几个问题。首先,“program”是为什么?在这种情况下,gdb不需要任何程序名称来启动。程序已经在远程运行,gdbserver已经连接到它。我只想让gdb客户端连接到9999端口。但无论如何,继续。

它要求我提供一个processId。这也没有意义,我已经连接到远程了。有趣的部分是:

  1. 如果你省略processId,VS Code会说“无法解析进程id”
  2. 如果您指定processId,VS Code会说“processId不能与miDebuggerServerAddress一起使用”

当然,如果我正在使用调试器服务器地址,服务器已经附加到PID,因此在这种情况下不能使用processId是有道理的。但是,如果我省略它,则VS Code会给出第一个错误。这在某种程度上是循环的。

任何人都可以在VS Code C++调试器中使用gdbserver地址连接到远程进程,这是我的问题。我的启动文件有什么问题?

1个回答

13

你需要使用 "launch" 请求代替 "attach"。我还需要添加默认的 "cwd" 选项。

"request": "launch",
"cwd": "${workspaceFolder}",

您可能还需要定义“additionalSOLibSearchPath”。

我的启动配置现在看起来像这样:

{
// 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": [
    {
        // "processId": "${command:pickProcess}",
        "name": "(gdb) Remote Attach",
        "type": "cppdbg",
        "request": "launch",
        "program": ".\\src\\binaryfolder\\app.nostrip",
        "additionalSOLibSearchPath": "arm-none-linux-gnueabi/libc/lib;./lib;C:\\DeviceSDK\\win-2.8.15\\sdk\\toolchains\\arm-4.4.1\\arm-none-linux-gnueabi\\libc\\lib;C:\\DeviceSDK\\win-2.8.15\\sdk\\platforms\\201205\\lib",
        // "processId": "${command:pickProcess}",
        "MIMode": "gdb",
        "cwd": "${workspaceFolder}",
        "miDebuggerPath": "C:\\DeviceSDK\\win-2.8.15\\sdk\\toolchains\\arm-4.4.1\\bin\\arm-none-linux-gnueabi-gdb.exe",
        "miDebuggerServerAddress": "192.168.205.88:51000",
        "miDebuggerArgs": " -ex 'handle all print nostop noignore'",
        "setupCommands": [
            {
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true,
            }
        ]
    },
]

请参见CppTools问题321


你能否分享一下你的laucnh.json文件,这样我就可以根据你提供的链接尝试制作出可用的东西了吗? - meguli
感谢 @pdcoxhead。在我的WSL Ubuntu上可以运行VScode,并且在QEMU上可以实现目标。 - Rahul Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接