VSCode开发容器内GDB无法命中断点的配置咨询
我的目标
- 在容器内通过以下命令用gdbserver运行C++程序
bazel run -c dbg --run_under="gdbserver :12345" //home:my_program
- 从VSCode开发容器内启动gdb,连接到运行中的gdbserver
遇到的问题
- 从VSCode开发容器内启动gdb时,看似成功连接到gdbserver(输出如下),但程序执行不会在断点处停止
Process /home/my_program created; pid = 30687 Listening on port 12345 Remote debugging from host 127.0.0.1
- 只有在宿主机(开发容器外)的VSCode中启动gdb,才能成功连接gdbserver并命中断点
我的环境配置
launch.json内容如下:
{ "version": "0.2.0", "configurations": [ { "name": "C++ Launch", "type": "cppdbg", "request": "launch", "program": "/home/my_program", "miDebuggerPath": "/usr/bin/gdb", "miDebuggerServerAddress": ":12345", "cwd": "/home", "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], } ] }
该配置在开发容器外可正常工作。
已尝试的解决方法
- 添加以下配置段,但无效果
"pipeTransport": { "pipeCwd": "${workspaceFolder}", "pipeProgram": "docker", "pipeArgs": [ "exec", "-i", "jolly_gauss", "sh", "-c" ], "debuggerPath": "/usr/bin/gdb" },
- 在Docker容器启动时转发12345端口,无效果
我的问题
若要在VSCode开发容器内启动调试器并正常工作,我还缺少哪些配置?
期望实现:从开发容器内启动gdb,连接到容器内已运行的gdbserver,并让程序在断点处停止执行。
解决方案
针对你的问题,主要需要调整配置并注意几个关键细节:
1. 更换调试请求类型为attach
你当前用的是"request": "launch",但gdbserver已经启动了程序,应该用attach附加到已运行的调试会话,修改后的launch.json如下:
{ "version": "0.2.0", "configurations": [ { "name": "C++ Attach to gdbserver", "type": "cppdbg", "request": "attach", "program": "/home/my_program", "miDebuggerPath": "/usr/bin/gdb", "miDebuggerServerAddress": ":12345", "cwd": "/home", "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "stopAtEntry": true } ] }
2. 让gdbserver启动时暂停程序
默认情况下gdbserver启动后会直接运行程序,可能导致你还没设置断点程序就执行完毕。修改启动命令,让gdbserver等待gdb连接后再启动程序:
bazel run -c dbg --run_under="gdbserver --wait :12345" //home:my_program
加上--wait参数后,gdbserver会暂停在启动阶段,直到gdb连接后才开始执行程序,给你足够时间设置断点。
3. 确认gdb与gdbserver版本匹配
容器内的gdb和gdbserver版本必须一致,否则会出现调试异常。执行以下命令检查版本:
gdb --version gdbserver --version
如果版本不一致,安装对应版本的调试工具即可。
4. 移除pipeTransport配置
因为你是在同一个容器内连接gdbserver,不需要通过docker exec的管道传输,直接删除pipeTransport相关配置,避免干扰调试流程。
5. 检查断点有效性
确保断点设置在程序实际执行的代码路径上,不要设置在未被调用或被编译器优化掉的代码上。如果源码路径在容器内外存在映射差异,可在launch.json中添加"sourceFileMap"字段映射路径,例如:
"sourceFileMap": { "/container/source/path": "${workspaceFolder}/local/source/path" }
内容的提问来源于stack exchange,提问作者Ken X
相关产品推荐
相关产品推荐

