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操作系统: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 "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 "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\nBUILD
cc_binary(\n name = "sample",\n srcs = ["main.cpp"],\n visibility = ["//main:__pkg__"],\n)\n
Run Code Online (Sandbox Code Playgroud)\n\nmain.cpp
#include <iostream>\n\nint main() {\n std::cout << "tests" << std::endl;\n return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\nsample.code-workspace
{\n "folders": [ {"path": "."} ],\n "settings": {}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n更新。1
\n\n尝试调试 bazel 构建的可执行文件并直接使用 lldb 手动构建:
\n\nBazel 构建的二进制文件 bazel build --compilation_mode=dbg sample
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
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\nnm -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更新。2
\n\n将 Bazel 更新到版本 0.17.2(问题#5545已修复)后,此问题仍然出现。
\n\n更新。3
\n\n最后证明是Bazel问题。我在这里创建了一个问题#6327
\n 归档时间: |
|
查看次数: |
3099 次 |
最近记录: |