c++ 远程调试 c++如何用gdbserver或vs code进行远程debug

老墨大大_5783

老墨大大_5783

2026-03-20

674人浏览

原创

gdbserver启动后程序立即退出是因默认不暂停,需在程序入口加raise(sigstop)或用--once配合ld_preload挂起;vs code调试须正确配置midebuggerpath、midebuggerserveraddress和sourcefilemap路径映射;多进程需手动设follow-fork-mode和detach-on-fork;变量显示源于-o2以上优化,应编译时用-o0 -g3。

c++ 远程调试 c++如何用gdbserver或vs code进行远程debug

gdbserver 启动后程序立即退出,连不上怎么办

常见现象是 gdbserver :2345 ./myapp 执行完就报 Process ./myapp created; pid = 1234 然后直接退出,没等 gdb 连。这不是 bug,是默认行为:gdbserver 启动目标进程后,**不暂停、不等待断点,直接运行到结束**。

正确做法是加 --once(可选)+ --attach 或更常用的是用 --once 配合 kill -STOP 提前挂起进程,但最稳的还是让程序自己停在入口:

  • 在目标程序开头插入 raise(SIGSTOP)(需 #include <signal.h></signal.h>),编译后运行 gdbserver :2345 ./myapp,它会卡住,此时 gdb 就能连
  • 或者用 gdbserver --once :2345 --wrapper env LD_PRELOAD=/path/to/libstop.so -- ./myapp,但太重,不推荐
  • 避免用 --attach 调试新进程——它只适用于已运行的 PID,对刚启动的 main 不友好

VS Code 的 launch.json 怎么配才不连错端口或路径

远程调试失败八成出在路径映射和端口转发上。VS Code 本身不直连目标机,它通过本地 gdb(如 arm-linux-gnueabihf-gdb)连 gdbserver,中间可能跨 SSH,所以必须明确三段路径:

  • miDebuggerPath 指向你本地的交叉 gdb,不是系统自带的 gdb;比如嵌入式开发就得写 /opt/gcc-arm/bin/arm-linux-gnueabihf-gdb
  • miDebuggerServerAddress 格式必须是 target_ip:port,不能带 localhost 或 127.0.0.1(那是你本机,不是目标机)
  • sourceFileMap 是关键:把本地源码路径(如 /home/dev/project/src/)映射到目标机绝对路径(如 /root/project/src/),少一个斜杠或大小写错,断点就无效

示例片段:

"sourceFileMap": {
    "/home/user/myproj/": "/opt/myapp/"
}

gdb 连上 gdbserver 后 set follow-fork-mode 无效

这是典型多进程场景下的坑:目标程序 fork 出子进程后,gdb 默认只跟 parent,子进程的符号、断点全丢。你以为打了断点,其实断在 parent 里,子进程飞走了。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

解决必须在连接后、运行前设置:

  • 连上后立刻执行 set follow-fork-mode child(跟子进程)或 set follow-fork-mode parent(默认)
  • 加 set detach-on-fork off,否则 gdb 会自动 detach 子进程,导致无法控制
  • 如果子进程还 exec 了新程序,得额外设 set follow-exec-mode new,不然符号表加载失败

这些命令不能写在 .gdbinit 里就完事——gdbserver 模式下,很多 init 命令不生效,必须手动敲或塞进 VS Code 的 setupCommands 数组里。

为什么断点命中但变量显示 <optimized out></optimized>

不是远程问题,是编译选项惹的祸。只要目标程序用了 -O2 或更高优化级,gcc/g++ 会内联函数、复用寄存器、删临时变量,gdb 就真找不到原始值了。

  • 调试版务必加 -O0 -g3 -fno-omit-frame-pointer;-g3 包含宏和内联展开信息,比 -g 更全
  • 嵌入式环境常为省空间开 -Os,它也会导致大量 <optimized out></optimized>,别忍,换 -O0
  • 检查是否误用了 strip:部署时 strip 掉了 debug info,gdbserver 就只剩二进制,自然读不到变量名

远程调试不放大这个问题,但它会让问题更难排查——你没法像本地那样快速重编再试。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2135

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3302

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1116

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3779

7

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4150

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3513

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2733

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6670

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

6302

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习