Vscode远程调试及gdbserver配置

news/2024/7/16 7:28:52 标签: vscode, ide, 编辑器

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

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

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

1.在远程机器上安装gdbserver

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

remote$ apt-get install gdbserver

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

remote$ brew install gdbserver

2. 在本地机器上安装gdb

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

local$ brew install gdb --with-all-targets

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

3.测试gdb

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

local$ ssh -L9091:localhost:9091 user@remote
remote$ cd ./myproject/ && make
remote$ gdbserver :9091 ./myprogram

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

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

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

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 实例:

(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,在本地挂载远程项目文件夹:

local$ mkdir ./myproject
local$ sshfs user@remote:myproject ./myproject

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

6. 配置 Visual Studio 代码

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

{
  "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:

local$ gdb ./myprogram
...
(gdb) target remote localhost:9091

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

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

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

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

# 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. 重复。

http://www.niftyadmin.cn/n/5028442.html

相关文章

【Linux】线程的概念

文章目录 📖 前言1. 线程的引入1.1 执行流:1.2 线程的创建:1.3 线程的等待: 2. 查看线程2.1 链接线程库:2.2 ps -aL: 3. 页表的认识3.1 二级页表:3.2 页表的实际大小: 4. 再看线程4.…

Django系列:Django应用(app)的创建与配置

Django系列 Django应用(app)的创建与配置 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article…

性能测试之压力测试

文章目录 一.基本介绍二.性能指标三.下载安装JMeter1.下载安装包2.启动JMeter 四.使用JMeter1.模拟用户请求2.填写测试地址3.接收测试结果4.结果解释 一.基本介绍 压力测试考察当前软硬件条件下系统所能承受的最大负荷并找到系统瓶颈所在。压测是为了系统在线上的处理能力和稳定…

【图论】有向图的强连通分量

算法提高课笔记 文章目录 理论基础SCC板子 例题受欢迎的牛题意思路代码 学校网络题意思路代码 最大半连通子图题意思路代码 银河题意思路代码 理论基础 什么是连通分量? 对于一个有向图,分量中任意两点u,v,必然可以从u走到v&am…

Python编程语言学习笔记

目录 1 书写格式1.1 程序框架格式1.1 注释1.2 保留字 2 数据2.1 整数类型2.2 浮点类型2.3 复数类型2.4 数值运算符2.5 数值运函数2.6 数值类型转换函数2.7 math 库2.8 字符串2.8.1 字符串的表示2.8.2 字符串的区间访问2.8.3 字符串操作符2.8.4 字符串操作函数 2.9 字符串类型的…

解决sass问题:npm ERR! node-sass@9.0.0 postinstall: `node scripts/build.js`

目录 一、遇到问题 解决办法 二、 再次遇到问题 解决办法 题外话 一、遇到问题 1.运行这个项目的适合,遇到了没有sass的问题 解决办法 然后就用命令下载sass npm install node-sass 二、 再次遇到问题 2.下载sass的时候又发现了一个这样的问题 npm ER…

计算机毕业设计 基于SSM+Vue的志愿者招募网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

laravel框架 - 辅助函数

Laravel 常用辅助函数 辅助函数 Laravel 包含各种全局辅助函数。 laravel 中包含大量辅助函数,您可以使用它们来简化开发工作流程。 array_dot() 辅助函数允许你将多维数组转换为使用点符号的一维数组 $array [user > [username > something],app > [c…