我已经在使用Bazel构建系统的Visual Studio Code中开始了一个C++项目。但是,当使用Bazel构建二进制文件时,IDE中的调试功能无法正常工作。
当使用
我的设置: 操作系统:MacOS,Bazel版本:release 0.17.2-homebrew,VS Code版本:1.27.2
这是由于Bazel编译的方式引起的。是否有任何解决方法使调试工作?
以下是一个最小化的示例。只需在编辑器中设置断点,运行调试,并观察断点未被命中:
我发现这些路径指向Bazel用于构建的沙箱环境。而且这个路径已经不可访问了。
这可能是由于Bazel的已知问题#5545引起的。
当使用
clang++ -g main.cpp -o sample
构建应用程序时,我可以进行调试。我的设置: 操作系统:MacOS,Bazel版本:release 0.17.2-homebrew,VS Code版本:1.27.2
这是由于Bazel编译的方式引起的。是否有任何解决方法使调试工作?
以下是一个最小化的示例。只需在编辑器中设置断点,运行调试,并观察断点未被命中:
├── .vscode
│ ├── launch.json
│ └── tasks.json
├── BUILD
├── WORKSPACE
├── main.cpp
└── sample.code-workspace
.vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/bazel-bin/sample",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "lldb",
"preLaunchTask": "bazel build",
}
]
}
.vscode/tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "bazel build",
"type": "shell",
"command": "bazel",
"args": [
"build",
"--compilation_mode=dbg",
"sample"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
BUILD
cc_binary(
name = "sample",
srcs = ["main.cpp"],
visibility = ["//main:__pkg__"],
)
main.cpp
#include <iostream>
int main() {
std::cout << "tests" << std::endl;
return 0;
}
sample.code-workspace
{
"folders": [ {"path": "."} ],
"settings": {}
}
更新 1
尝试使用 lldb 调试 bazel 构建的可执行文件和手动构建的可执行文件:
bazel 构建的二进制文件 bazel build --compilation_mode=dbg sample
lldb bazel-bin/sample
(lldb) breakpoint set -n main
Breakpoint 1: 13 locations.
(lldb) r
Process 24391 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x00000001000021b0 sample`main
sample`main:
-> 0x1000021b0 <+0>: pushq %rbp
0x1000021b1 <+1>: movq %rsp, %rbp
0x1000021b4 <+4>: subq $0x20, %rsp
0x1000021b8 <+8>: movq 0xe51(%rip), %rdi ; (void *)0x00007fff9c93a660: std::__1::cout
Target 0: (sample) stopped.
手动构建二进制文件 clang++ -g main.cpp -o sample
lldb sample
(lldb) breakpoint set -n main
Breakpoint 1: where = sample`main + 29 at main.cpp:4, address = 0x0000000100000f9d
(lldb) r
Process 24410 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100000f9d sample`main at main.cpp:4
1 #include <iostream>
2
3 int main() {
-> 4 std::cout << "tests" << std::endl;
5 return 0;
6 }
Target 0: (sample) stopped.
在可执行文件中查找“调试笔记”(感谢此答案)后
nm -pa bazel-bin/sample | grep OSO
000000005bb7c96b - 03 0001 OSO /private/var/tmp/_bazel_teivaz/1e731ee5ae5a3ce6177976984318ec76/bazel-sandbox/1688134534644271312/execroot/__main__/bazel-out/darwin-dbg/bin/_objs/sample/main.o
我发现这些路径指向Bazel用于构建的沙箱环境。而且这个路径已经不可访问了。
这可能是由于Bazel的已知问题#5545引起的。
更新2
将Bazel更新到0.17.2版本(其中问题#5545已经解决),但仍存在此问题。
更新3
最终发现是Bazel的问题。我在这里创建了一个问题#6327。
workspaceRoot
已被弃用,推荐使用workspaceFolder
--sandbox_debug=true
标志才能进行调试。