在 MacOS 上使用 Bazel 构建时,调试 C++ 代码不起作用

tei*_*vaz 5 c++ macos bazel visual-studio-code

我已经使用 Bazel 构建系统在 Visual Studio Code 中启动了一个 C++ 项目。但是,当使用 Bazel 构建二进制文件时,调试在 IDE 中不起作用。

\n\n

我可以在使用 .build 构建时调试应用程序clang++ -g main.cpp -o sample

\n\n

我的设置:\n操作系统:MacOS,Bazel:release 0.17.2-homebrew,VS Code:1.27.2

\n\n

这是由 Bazel 编译方式造成的。有什么解决方法可以使调试工作吗?

\n\n

这是一个最小的例子。只需在编辑器中放置一个断点,运行调试,然后观察断点未被命中:

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .vscode\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 launch.json\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tasks.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 BUILD\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 WORKSPACE\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.cpp\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 sample.code-workspace\n
Run Code Online (Sandbox Code Playgroud)\n\n

.vscode/launch.json

\n\n
{\n    "version": "0.2.0",\n    "configurations": [\n        {\n            "name": "(lldb) Launch",\n            "type": "cppdbg",\n            "request": "launch",\n            "program": "${workspaceRoot}/bazel-bin/sample",\n            "args": [],\n            "stopAtEntry": false,\n            "cwd": "${workspaceFolder}",\n            "externalConsole": false,\n            "MIMode": "lldb",\n            "preLaunchTask": "bazel build",\n        }\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

.vscode/tasks.json

\n\n
{\n    "version": "2.0.0",\n    "tasks": [\n        {\n            "label": "bazel build",\n            "type": "shell",\n            "command": "bazel",\n            "args": [\n                "build",\n                "--compilation_mode=dbg",\n                "sample"\n            ],\n            "group": {\n                "kind": "build",\n                "isDefault": true\n            }\n        }\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

BUILD

\n\n
cc_binary(\n    name = "sample",\n    srcs = ["main.cpp"],\n    visibility = ["//main:__pkg__"],\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

main.cpp

\n\n
#include <iostream>\n\nint main() {\n    std::cout << "tests" << std::endl;\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

sample.code-workspace

\n\n
{\n    "folders": [ {"path": "."} ],\n    "settings": {}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

更新。1

\n\n

尝试调试 bazel 构建的可执行文件并直接使用 lldb 手动构建:

\n\n

Bazel 构建的二进制文件 bazel build --compilation_mode=dbg sample

\n\n
lldb bazel-bin/sample\n(lldb) breakpoint set -n main\nBreakpoint 1: 13 locations.\n(lldb) r\nProcess 24391 stopped\n* thread #1, queue = \'com.apple.main-thread\', stop reason = breakpoint 1.1\n    frame #0: 0x00000001000021b0 sample`main\nsample`main:\n->  0x1000021b0 <+0>: pushq  %rbp\n    0x1000021b1 <+1>: movq   %rsp, %rbp\n    0x1000021b4 <+4>: subq   $0x20, %rsp\n    0x1000021b8 <+8>: movq   0xe51(%rip), %rdi         ; (void *)0x00007fff9c93a660: std::__1::cout\nTarget 0: (sample) stopped.\n
Run Code Online (Sandbox Code Playgroud)\n\n

手动构建的二进制文件 clang++ -g main.cpp -o sample

\n\n
lldb sample\n(lldb) breakpoint set -n main\nBreakpoint 1: where = sample`main + 29 at main.cpp:4, address = 0x0000000100000f9d\n(lldb) r\nProcess 24410 stopped\n* thread #1, queue = \'com.apple.main-thread\', stop reason = breakpoint 1.1\n    frame #0: 0x0000000100000f9d sample`main at main.cpp:4\n   1    #include <iostream>\n   2    \n   3    int main() {\n-> 4        std::cout << "tests" << std::endl;\n   5        return 0;\n   6    }\nTarget 0: (sample) stopped.\n
Run Code Online (Sandbox Code Playgroud)\n\n

查找可执行文件中的“调试注释”后(感谢这个答案

\n\n
nm -pa bazel-bin/sample | grep OSO\n000000005bb7c96b - 03 0001   OSO /private/var/tmp/_bazel_teivaz/1e731ee5ae5a3ce6177976984318ec76/bazel-sandbox/1688134534644271312/execroot/__main__/bazel-out/darwin-dbg/bin/_objs/sample/main.o\n
Run Code Online (Sandbox Code Playgroud)\n\n

我发现这些路径指向Bazel用来构建的沙箱环境。而这条路已经无法通行了。

\n\n

这可能是由 Bazel #5545中的一个已知问题引起的

\n\n
\n\n

更新。2

\n\n

将 Bazel 更新到版本 0.17.2(问题#5545已修复)后,此问题仍然出现。

\n\n
\n\n

更新。3

\n\n

最后证明是Bazel问题。我在这里创建了一个问题#6327

\n

小智 2

(促进更新答案):看起来像一个已知问题:#6327