如何在 VSCODE 中使用"sudo"调试程序

How to debug programs with "sudo" in VSCODE

本文关键字:sudo 调试程序 VSCODE      更新时间:2023-10-16

我正在尝试调试VSCODE中的程序。该程序需要以root身份启动,或者在Ubuntu上使用"sudo"启动。实现这一目标的最佳方式是什么?一个示例启动配置将会有所帮助。谢谢。

我最近也遇到过类似的情况我通过在launch中添加{"sudo": true}解决了这个问题。.vscode目录下的Json文件。

刚刚在.vscode>launch.json中添加了以下行

{
    "version": "0.2.0",
    "configurations": [
        {
            "other..." : "configs...",
            "request": "launch",
            "console": "integratedTerminal",
            "args": [
                "${file}"
            ],
            "sudo": true
        }
    ]
}

VS code版本我使用的是-

版本:1.49.1操作系统:Ubuntu 16.04 LTS, 64位

这似乎不适用于所有语言。对我来说,它适用于python 3。

我做了以下操作:

  1. 创建一个名为"gdb"的脚本,例如在我的主目录中,包含:pkexec /usr/bin/gdb "$@"
  2. 使其可执行
  3. 修改启动。通过添加"miDebuggerPath":
  4. 来调用脚本(显然要相应地更改用户名)
...
            "externalConsole": false,
            "miDebuggerPath": "/home/<username>/gdb",
            "MIMode": "gdb",
...
  • 在调试时,使用top或类似的方法来验证进程是否以root身份运行。

    这应该足够了。

  • 我的解决方案:

    /etc/sudoers中加入/usr/bin/gdb

    添加一个内容为

    的可执行文件
    sudo /usr/bin/gdb "$@"
    

    设置miDebuggerPath为文件

    不知道如何让vscode运行sudo gdb。但是你可以用sudo来运行vscode,所以你可以用sudo来调试gdb。

    sudo代码。——user-data-dir = '。'

    launch.json :

    {
        "miDebuggerPath": "${workspaceFolder}/gdb_root.sh"
    }
    

    gdb_root.sh :

    #!/bin/bash
    SELF_PATH=$(realpath -s "$0")
    if [[ "$SUDO_ASKPASS" = "$SELF_PATH" ]]; then
        zenity --password --title="$1"
    else
        exec env SUDO_ASKPASS="$SELF_PATH" sudo -A /usr/bin/gdb $@
    fi
    

    chmod +x gdb_root.sh

    c :

    #define _GNU_SOURCE
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    int main()
    {
        // accept signal from VSCode for pausing/stopping
        char *sudo_uid = getenv("SUDO_UID");
        if (sudo_uid)
            setresuid(0, 0, atoi(sudo_uid));
        printf("uid = %dn", getuid());
    }
    

    这适用于java,但也可能适用于其他语言:

    当第一次运行调试会话时,VSCode创建一个终端,例如Debug: Main。只需打开终端,按Ctrl+C,输入sudo su,输入密码,下一次调试会话将以root权限从该终端启动

    解决这个问题非常简单的方法是:

    $ sudo chown root:$(id -g) ~/go/bin/dlv
    $ sudo chmod u+s ~/go/bin/dlv
    

    这样dlv将作为root执行。

    对于其他语言也是一样的。允许调试器以root身份运行,而不是依赖于其他配置文件或包装器。

    与前面的答案一样,我必须在主目录下使用可执行文件的方法,如:/home/youruser/gdbasroot

    但是我必须使用内容:

    sudo/usr/bin/gdb "$@"

    而不是gdbk,因为我不能让gdbk工作而不提示密码(它不工作,因为它被vscode远程调试器调用)。我是根据这个帖子(被点赞和接受的答案)做的:

    https://askubuntu.com/questions/542397/change-default-user-for-authentication

    当你使用sudo时,你可以在vscode终端发出sudo命令,然后你可以使用"sudo调试器"。没有密码。否则vscode会收到提示,无法处理。

    问候