使用Bazel编译C++并通过GDB启动时VS Code断点失效排查
问题描述
我在Windows系统下的Documents文件夹内的一个简单仓库中构建要调试的C++文件。尝试了Bazel的多个输出路径(可查看launch.json中被注释的program属性):
- 除当前启用的路径外,其余路径均可启动程序,但无论入口还是断点都无法暂停
- 当前启用的路径能在入口处暂停,但返回异常文件路径:指向空的Desktop文件夹,且路径重复,格式如
C:\Users\peter\Desktop\simple_project\C\Users\peter\Desktop\simple_project\main.cc
怀疑是GDB编译的调试符号包含错误路径,请问是否为此问题?若是,如何指定编译正确的符号?
配置文件
launch.json
{ "version": "0.2.0", "configurations": [ { "name": "Bazel Debug", "preLaunchTask": "Bazel build (debug)", "type": "cppdbg", "request": "launch", "cwd": "${workspaceRoot}", "program": "${workspaceRoot}/bazel-${workspaceFolderBasename}/${relativeFileDirname}/${fileBasenameNoExtension}.exe", // "program": "${workspaceRoot}/bazel-out/x64_windows-dbg/bin/${relativeFileDirname}/${fileBasenameNoExtension}.exe", //"program": "${workspaceRoot}/bazel-bin/${relativeFileDirname}/${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": true, "MIMode": "gdb", "targetArchitecture": "x64", "miDebuggerPath": "C:\\ProgramData\\cygwin64\\bin\\gdb.exe", "launchCompleteCommand": "exec-run", "sourceFileMap": { "${workspaceFolder}/bazel-${workspaceFolderBasename}": "${workspaceFolder}" }, "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": false } ] } ] }
tasks.json
{ "version": "2.0.0", "tasks": [ { "label": "Bazel build (debug)", "type": "shell", "command": "bazel build --compiler=C:\\ProgramData\\cygwin64\\bin\\g++.exe --strip=never -c dbg //...", "group": "build" } ] }
解决方案
你的判断完全正确,问题出在调试符号中嵌入的源文件路径错误——Windows和Cygwin的路径格式冲突导致了路径重复、指向错误目录的问题。按以下步骤修复:
1. 修正Bazel编译参数,生成正确的调试符号路径
在tasks.json的Bazel构建命令中添加--copt=-fdebug-prefix-map参数,将Bazel构建时生成的临时路径映射回你的真实项目路径:
- 先执行
bazel info execution_root获取Bazel的执行根目录(比如C:/Users/peter/_bazel_peter/abc123) - 用真实项目路径(比如
C:/Users/peter/Documents/simple_project)替换映射的目标路径
修改后的tasks.json命令示例:
"command": "bazel build --compiler=C:\\ProgramData\\cygwin64\\bin\\g++.exe --strip=never -c dbg --copt=-fdebug-prefix-map=C:/Users/peter/_bazel_peter/abc123=C:/Users/peter/Documents/simple_project //..."
注意:路径统一使用正斜杠
/,避免Windows反斜杠的转义问题
2. 更新launch.json的sourceFileMap配置
当前的映射规则不匹配错误的符号路径,需要覆盖两种错误场景:
"sourceFileMap": { "C:/Users/peter/Desktop/simple_project": "C:/Users/peter/Documents/simple_project", "C:/Users/peter/Desktop/simple_project/C:/Users/peter/Desktop/simple_project": "C:/Users/peter/Documents/simple_project" }
这样GDB就能把错误的Desktop路径、重复路径都映射到你的真实项目目录。
3. 切换到标准的Bazel调试输出路径
建议启用你注释掉的第二个program路径,这是Bazel调试构建的标准输出目录,之前无法断点是因为符号路径错误,修复后即可正常工作:
"program": "${workspaceRoot}/bazel-out/x64_windows-dbg/bin/${relativeFileDirname}/${fileBasenameNoExtension}.exe"
4. 验证调试符号路径(可选)
可以用GDB手动确认符号路径是否正确:
- 打开命令行,执行
gdb.exe <你的exe文件完整路径> - 输入
info sources命令,查看输出的源文件路径是否已经指向真实的Documents目录
内容的提问来源于stack exchange,提问作者Peter Baintner
相关产品推荐
相关产品推荐

