Vscode远程调试及gdbserver配置

如果你像我一样更喜欢使用 GUI 而不是命令行来设置断点、单步调试代码以及在程序运行时检查值,那么您可以通过以下方法设置 VSCode 和 gdbserver 以在运行时在本地编辑和调试代码它在远程服务器上。

注意:我在本地使用 macOS Sierra,远程计算机运行 Ubuntu 14.04,但本指南适用于任何 Unix 系统。(对不起,Windows 用户)。

注意:要在远程计算机上运行的命令以 为前缀remote$,本地命令以 为前缀local$

1.在远程机器上安装gdbserver

安装因系统而异。在 Debian/Ubuntu 上,您可以执行以下操作:

bash 复制代码
remote$ apt-get install gdbserver

我使用Linuxbrew将其安装到我的用户文件夹中:

bash 复制代码
remote$ brew install gdbserver

2. 在本地机器上安装gdb

在 macOS Sierra 上,我使用Homebrew安装 gdb:

bash 复制代码
local$ brew install gdb --with-all-targets

注意: --with-all-targets**选项很重要;如果没有它,您将无法在操作系统或体系结构与本地计算机不同的远程计算机上进行调试。

3.测试gdb

此时,您应该能够在远程计算机上运行 gdbserver 并从本地 gdb CLI 连接到它。我将使用ssh-L选项将本地端口 9091 连接转发到远程端口 9091:

bash 复制代码
local$ ssh -L9091:localhost:9091 user@remote
remote$ cd ./myproject/ && make
remote$ gdbserver :9091 ./myprogram

(端口 9091 是任意的;使用您喜欢的任何端口号)

让该命令在终端窗口中运行;它会等到 gdb 连接后再运行./myprogram

在本地计算机上的另一个终端窗口中,运行 gdb:

bash 复制代码
local$ gdb
GNU gdb (GDB) 7.12
Copyright (C) 2016 Free Software Foundation, Inc.
...
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb)

然后连接到 gdbserver 实例:

bash 复制代码
(gdb) target remote localhost:9091
Remote debugging using localhost:9091
...
(gdb)

要验证一切是否正常,您可以运行各种 gdb 命令,例如info sources,或使用 来设置断点break。使用continue来运行./myprogram.

4. 协同设计gdb

VSCode 会阻止您运行 gdb,除非它已签名

5.同步本地和远程文件系统

您可能已经注意到,对于基本功能,本地计算机上的 gdb CLI 不需要提供有关程序或其源代码的任何信息,除了运行 gdbserver 的主机和端口之外。但您希望保持本地和远程项目目录同步有两个重要原因:

  • 在 gdb CLI 中查看源代码(即list)。
  • VSCode C/C++ 扩展要求您提供已编译可执行文件的路径以启动 gdb。("program"launch.json 中的字段)。

我选择使用sshfs,因为它需要最少的服务器端设置,但您可以使用 NFS、rsync 或其他替代方案。

使用 sshfs,在本地挂载远程项目文件夹:

bash 复制代码
local$ mkdir ./myproject
local$ sshfs user@remote:myproject ./myproject

注意:在 macOS 上,您可以稍后使用 卸载该目录 umount ./myproject*。在 Linux 上,使用* fusermount -u ./myproject*.*

6. 配置 Visual Studio 代码

./myproject/在 VSCode 中打开新安装的项目,然后打开.vscode/launch.json或创建它(如果不存在):

XML 复制代码
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C++ Launch",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceRoot}/myprogram",
      "miDebuggerServerAddress": "localhost:9091",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceRoot}",
      "environment": [],
      "externalConsole": true,
      "linux": {
        "MIMode": "gdb"
      },
      "osx": {
        "MIMode": "gdb"
      },
      "windows": {
        "MIMode": "gdb"
      }
    }
  ]
}

此配置将使单击"C++ Launch"将运行类似于以下内容的 gdb:

bash 复制代码
local$ gdb ./myprogram
...
(gdb) target remote localhost:9091

7. 编写脚本来编译程序并启动 gdbserver

理想情况下,您希望能够运行单个命令或单击单个按钮来编译和调试程序。

这可能可以通过VSCode 任务preLaunchTasklaunch.json 中的选项来完成,但我无法使用这些任务组合一个简单的解决方案。

相反,我编写了一个快速而肮脏的 shell 脚本prepare_remote_debug.sh

bash 复制代码
# Kill gdbserver if it's running
ssh user@remote killall gdbserver &> /dev/null
# Compile myprogram and launch gdbserver, listening on port 9091
ssh \
  -L9091:localhost:9091 \
  user@remote \
  "zsh -l -c 'cd myproject && make && gdbserver :9091 ./myprogram'"

8.开始调试

这是您的新工作流程:

  1. 编辑一些代码。
  2. ./prepare_remote_debug.sh在终端窗口中运行。您的程序的输出将出现在这里。
  3. 设置一些断点。
  4. 运行"C++ 启动"。
  5. 在 VSCode 的调试器中单步执行代码。
  6. 重复。
相关推荐
龙智DevSecOps解决方案9 小时前
Perforce《2024游戏技术现状报告》Part2:游戏引擎、版本控制、IDE及项目管理等多种开发工具的应用分析
数据仓库·ide·游戏·游戏引擎·源代码管理
前端青山12 小时前
Node.js 全栈开发进阶篇
linux·开发语言·前端·node.js·编辑器·vim
南城花随雪。13 小时前
IDEA接入OpenAI API 方法教程
java·ide·intellij-idea
三毛村滴雪鱼粉13 小时前
IntelliJ Idea设置自定义快捷键
java·ide·intellij-idea·idea·intellij idea
HolyCode_13 小时前
新版 idea 编写 idea 插件时,启动出现 ClassNotFound
java·ide·intellij-idea
'零'Bug13 小时前
开发工具 IntelliJ IDEA 使用技巧、快捷键、插件分享
java·ide·intellij-idea·intellij idea
little redcap13 小时前
xftp连接中不成功 + sudo vim 修改sshd_config不成功的解决方法
linux·编辑器·vim
zwhfyy13 小时前
webstorm 设置总结
前端·ide·webstorm
single59415 小时前
c++学习:封装继承多态
开发语言·c++·git·vscode·学习
秦时明月之君临天下16 小时前
VSCode设置长行自动折行
ide·vscode·编辑器