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

uqdfh47h  于 2022-12-04  发布在  其他
关注(0)|答案(2)|浏览(80)

我注意到node.js有一个调试器“自动附加”特性,如果可能的话,我希望使用这个特性。我不认为我可以在重新编译程序后使用“自动附加”来自动启动调试器。(类似)因此在运行“make”后,我会得到一个正常的(linux)可执行文件。然后,我执行二进制文件,并经常希望立即调试它,我将完整的二进制路径设置为一个环境变量“$myprog=/home/user/my-dev/bin/myApp”。
因此,我所做的是使用“Attach to process”运行调试,每次我都必须在下拉列表中找到合适的进程,但我每天、每小时都要做太多次,这变得 * 乏味 *,希望有更智能、“更自动”的东西:
除了“auto attach”(据我所知,仅适用于node.js),我希望修改launch.json,使其自动提取进程ID,例如使用shell命令:'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"
        },

是否可以修改launch.json文件,以便VS代码理解变量“processId”应替换为以下shell输出:'pgrep -x“$myprog”'(显然这个PID会改变,每次编译和执行程序后都要调试)?如果是这样的话,我猜也可以把它绑定到一个键盘快捷键上......有人知道怎么实现吗?

xiozqbni

xiozqbni1#

是的,使用Tasks Shell Input Extension是可能的。它提供了一个可以返回shell命令结果的vscode命令。
工作区的相关部分如下所示。

"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,
          }
        }
    ]
}

每当我运行Start Debugging时,它都会自动找到相关的进程并进行连接。
This Stack Overflow问题更一般地讨论扩展。

nzrxty8p

nzrxty8p2#

如果您可以使用LLDB,但Shell输入扩展由于某种原因不能正常工作,则您的程序还可以使用调试信息调用Visual Studio代码,以要求它按此处所述进行连接。
rust eclipse :

#[cfg(debug_assertions)]
{
    let url = format!("vscode://vadimcn.vscode-lldb/launch/config?{{'request':'attach','pid':{}}}", std::process::id());
    std::process::Command::new("code").arg("--open-url").arg(url).output().unwrap();
    std::thread::sleep_ms(1000); // Wait for debugger to attach
}

丙:

char command[256];
snprintf(command, sizeof(command), "code --open-url \"vscode://vadimcn.vscode-lldb/launch/config?{'request':'attach','pid':%d}\"", getpid());
system(command);
sleep(1); // Wait for debugger to attach

或者将以下内容添加到launch.json:

// This waits a second and calls VS code to attach lldb
    "preLaunchTask": "Attach LLDB Later"

然后将以下内容添加到tasks.json:

{
    "label": "Attach LLDB Later",
    "type": "shell",
    "command": "/bin/bash",
    // Called from a preLaunchTask.  First wait for it to start up.
    // Then call VS code and tell it to attach with the LLDB debugger.
    "args": ["-c", "echo Waiting for launch...;sleep 2; code --open-url \"vscode://vadimcn.vscode-lldb/launch/config?{\\\"request\\\":\\\"attach\\\",\\\"pid\\\":$(pgrep --full --newest godot.\\*remote-debug)}\";echo LLDB attached."],
    "isBackground": true,
    // All this is needed so VSCode doesn't complain about the background task.
    "problemMatcher": [
        {
        "pattern": [
            {
            "regexp": ".",
            "file": 1,
            "location": 2,
            "message": 3
            }
        ],
        "background": {
            "activeOnStart": true,
            "beginsPattern": ".",
            "endsPattern": ".",
        }
        }
    ]
},

但是更改“pgrep --full --newsgodot.*remote-debug”来搜索您的进程。我使用它在同一个Godot可执行文件上同时调试两种语言。带有GDScript调试器和Tasks Shell Input Extension的Compound Launch试图同时启动两个调试器,并且直到配置了LLDB启动之后才启动我想要的PID的可执行文件。后台preLaunchTask修复了这个问题。

相关问题