用 vscode 以 root 权限远程调试

经验

最近工作环境几乎完全变成了在服务器上开发,加上 vscode 的远程开发插件已经比较完善了,不管是在服务器上还是 WSL 上面用都挺舒服。把遇到的问题写一下做个记录。

装插件

首先保证服务器能联网,然后本地安装 Remote Development 全家桶,可以直接编辑 远程服务器/本地WSL/本地容器 上面的代码。左下角多一个按钮,首次连接后会在服务器自动下载 vscode-server 到家目录,之后每次连接就可以正常用了。

好处就是如果手头有服务器,本地开发机可以不用配置任何环境,全在服务器上搞,一次配置好就可以很多人一起共用一个环境。

调试 C/C++

打开项目文件夹后,要调试需要配置一下项目的 launch.json

命令面板里面直接输 launch 有条命令可以直接生成一个模板,然后改一改

例如

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++ build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "/home/xxx/a.out", // 要运行的程序
            "args": ["xxx"],
            "stopAtEntry": false,
            "cwd": "/home/xxx/", // 运行目录
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "",
            "miDebuggerPath": "/usr/bin/gdb1" // debugger 程序
        }
    ]
}

root 权限调试

遇到的一个问题是现在写的东西编译完了必须要 root 权限运行,而我又不想总是用 root 账号。其实是可以的,参考了这个issue里的评论

方法是:

  1. 首先建一个 sh 脚本,在里面 sudo 运行 gdb, 例如一个叫 gdb1 的脚本,给它运行权限 sudo chmod 0755 gdb1, 脚本内容是:

    #!/bin/sh
    sudo gdb $@
    
  2. launch.json里面将调试命令改为这个脚本

  3. 运行 sudo sysctl -w kernel.yama.ptrace_scope=0 这是从那个 issue 看到的,不然权限还是有问题

  4. 随便执行个 sudo 啥,让自己处在 sudo 暂时不用输密码的状态。我也不知道这里是不是做的不太对,我这里如果不这样做的话调试器打开后不会等着输密码而是会退出,这样做能避免。

  5. 这样应该就可以远程以 root 权限调试程序了

然后

其他有什么问题看到再补充。