VS Code 调试:附加到进程 ID 时,是否可以提供进程 ID 'pgrep -x "$myprog"' 以在 launch.json(变量“processId”)中使用?

Oka*_*key 5 debugging compilation visual-studio-code

我注意到 Node.js 有一个调试器“自动附加”功能,如果可能的话我想使用它。但是,我不认为在重新编译程序后可以使用“自动附加”来自动启动调试器。我使用 C/C++/Fortran 使用 makefile(和类似文件)编译我的程序,因此在运行“make”后我得到一个正常的(linux)可执行文件。然后,我执行该二进制文件,并且通常希望在此之后立即对其进行调试。我已将完整的二进制路径设置为环境变量"$myprog=/home/user/my-dev/bin/myApp"

所以我所做的就是使用“附加到进程”来运行调试,每次我都必须在下拉列表中找到正确的进程,但我每天、每小时都这样做太多次,这变得很乏味,并且想要更智能的东西,“更自动”:

我想修改我的launch.json,以便它使用例如shell命令自动提取进程ID,而不是“自动附加”(仅适用于node.js,据我所知):并且可以选择将'pgrep -x "$myprog"'其绑定到键盘-捷径。

我猜该行"processId": "${command:pickProcess}"需要修改,请参阅下面的示例配置:

{
    "name": "(gdb) Attach (any)",
    "type": "cppdbg",
    "request": "attach",
    "program": "/home/user/my-dev/bin/myApp",
    "processId": "${command:pickProcess}",
    "MIMode": "gdb",
    "miDebuggerPath": "/usr/bin/gdb"
},
Run Code Online (Sandbox Code Playgroud)

是否可以修改该launch.json文件,以便 VS code 理解变量“processId”应该被 shell 输出替换:(pgrep -x "$myprog"显然,在每次编译和执行要调试的程序之后,这个 PID 都会发生变化)?

如果是这样,我想也可以将它绑定到键盘快捷键?有谁知道如何实现这一目标?

小智 9

是的,使用Tasks Shell 输入扩展是可以实现的。它提供了一个 vscode 命令,可以返回 shell 命令的结果。

我的工作区的相关部分如下所示。

"launch": {
    "configurations": [
        {
            ...
            "processId": "${input:FindVivadoPID}",
            ...
        }
    ],
    "inputs": [
        {
          "id": "FindVivadoPID",
          "type": "command",
          "command": "shellCommand.execute",
          "args": {
            "command": "pgrep 'ecold.*lnx64.g/vivado' -f",
            "description": "Select your Vivado PID",
            "useFirstResult": true,
          }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

每当我运行时Start Debugging,它都会自动查找相关进程并附加。

另请参阅使用 shell 命令作为 VSCode 任务变量值,其中更广泛地讨论了扩展。