System details

  • 操作系统和版本:macOS high sierra 10.13.4

  • VS代码版本:1.25.1

  • C / C扩展版本:0.17.7

  • 已安装其他扩展程序

  • bazel:0.10.0-homebrew

  • lldb:lldb-902.0.79.2

  • gdb:GNU gdb(GDB)8.0.1

BUG description

我使用bazel来构建一个教程C项目 . 源代码非常简单如下:

#include <iostream>
#include <string>

using namespace std;

void greet(const string& person) {
    cout << "Hello, " << person << "!" << endl;
}

int main(int argc, char** argv) {
    if(argc >= 2) {
        greet(argv[1]);
    } else {
        int x = 0;
        int y = 0;
        int c;
        c = x * y;
        cerr << "insufficient args, usage: " << argv[0] << " personNameHere" << endl;
    }
    return 0;
}

我有一个像这样的task.json来运行bazel build:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "debuggable-build",
            "type": "shell",
            "command": "cd ${workspaceFolder}/hello && bazel build -c dbg --strip=never //hello:main",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": [
                    "relative",
                    "${workspaceFolder}"
                ],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        }
    ]
}

它适用于生成 ${workspaceFolder}/bazel-out/darwin-dbg/bin/hello/main 中的runnable main.o

然后我在vs代码中使用lldb进行调试 . 假设我在第11行设置了调试标志,如 int main(int argc, char** argv) {

我的launch.json描述如下:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(lldb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/bazel-out/darwin-dbg/bin/hello/main",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "lldb"
        }
    ]
}

然后我按下调试面板中的调试按钮 . 但是,它永远不会在第11行停止 . 所有的调试标签都会变成灰色,并告诉我:当我将鼠标悬停在它上面时,“未经检查的断点” .

vs代码终端输出结束如下:

Loaded '/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib'. Symbols loaded.
Loaded '/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib'. Symbols loaded.
Loaded '/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib'. Symbols loaded.
Loaded '/usr/lib/libcups.2.dylib'. Symbols loaded.
Loaded '/System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos'. Symbols loaded.
Loaded '/System/Library/Frameworks/GSS.framework/Versions/A/GSS'. Symbols loaded.
Loaded '/usr/lib/libresolv.9.dylib'. Symbols loaded.
Loaded '/usr/lib/libiconv.2.dylib'. Symbols loaded.
Loaded '/System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal'. Symbols loaded.
Loaded '/usr/lib/libheimdal-asn1.dylib'. Symbols loaded.
Loaded '/System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory'. Symbols loaded.
Loaded '/System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth'. Symbols loaded.
Loaded '/System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory'. Symbols loaded.
Loaded '/System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation'. Symbols loaded.
Loaded '/System/Library/PrivateFrameworks/APFS.framework/Versions/A/APFS'. Symbols loaded.
Loaded '/usr/lib/libutil.dylib'. Symbols loaded.
Loaded '/System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio'. Symbols loaded.
Loaded '/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox'. Symbols loaded.
Loaded '/System/Library/PrivateFrameworks/AppleSauce.framework/Versions/A/AppleSauce'. Symbols loaded.
Loaded '/System/Library/PrivateFrameworks/LinguisticData.framework/Versions/A/LinguisticData'. Symbols loaded.
Loaded '/usr/lib/libmarisa.dylib'. Symbols loaded.
Loaded '/System/Library/PrivateFrameworks/Lexicon.framework/Versions/A/Lexicon'. Symbols loaded.
Loaded '/usr/lib/libChineseTokenizer.dylib'. Symbols loaded.
Loaded '/usr/lib/libcmph.dylib'. Symbols loaded.
Loaded '/System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling'. Symbols loaded.
 locations added to breakpoint 1
Loaded '/System/Library/Frameworks/CoreData.framework/Versions/A/CoreData'. Symbols loaded.
Loaded '/System/Library/PrivateFrameworks/CoreEmoji.framework/Versions/A/CoreEmoji'. Symbols loaded.
Loaded '/System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement'. Symbols loaded.
Loaded '/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/BackgroundTaskManagement'. Symbols loaded.
Loaded '/usr/lib/libxslt.1.dylib'. Symbols loaded.
Loaded '/Users/shihuashen/x-mesh/example/bazel-out/darwin-dbg/bin/hello/main'. Symbols loaded.
Loaded '/System/Library/CoreServices/Encodings/libSimplifiedChineseConverter.dylib'. Symbols loaded.
The program '/Users/shihuashen/x-mesh/example/bazel-out/darwin-dbg/bin/hello/main' has exited with code 0 (0x00000000).

在由vs代码启动的运行终端中,似乎程序运行良好并且没有任何中断结束:

Launching: '/Users/shihuashen/x-mesh/example/bazel-out/darwin-dbg/bin/hello/main'
Working directory: '/Users/shihuashen/x-mesh/example'
1 arguments:
argv[0] = '/Users/shihuashen/x-mesh/example/bazel-out/darwin-dbg/bin/hello/main'
insufficient args, usage: /Users/shihuashen/x-mesh/example/bazel-out/darwin-dbg/bin/hello/main personNameHere
Process exited with status 0
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

我注意到bazel需要设置build -c dbg --strip = never以支持调试,就像我一样 . 同时,我试图在终端运行lldb,看起来效果很好 . 输出如下:

shihuashendeMacBook-Pro:hello shihuashen$ lldb main
(lldb) target create "main"
Current executable set to 'main' (x86_64).
(lldb) breakpoint set -n main
Breakpoint 1: 14 locations.
(lldb) r
Process 21174 launched: '/Users/shihuashen/x-mesh/example/bazel-out/darwin-dbg/bin/hello/main' (x86_64)
4 locations added to breakpoint 1
Process 21174 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100002120 main`main
main`main:
->  0x100002120 <+0>:  pushq  %rbp
    0x100002121 <+1>:  movq   %rsp, %rbp
    0x100002124 <+4>:  subq   $0xc0, %rsp
    0x10000212b <+11>: movl   $0x0, -0x5c(%rbp)
Target 0: (main) stopped.
(lldb) n
Process 21174 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = instruction step over
    frame #0: 0x0000000100002121 main`main + 1
main`main:
->  0x100002121 <+1>:  movq   %rsp, %rbp
    0x100002124 <+4>:  subq   $0xc0, %rsp
    0x10000212b <+11>: movl   $0x0, -0x5c(%rbp)
    0x100002132 <+18>: movl   %edi, -0x60(%rbp)
Target 0: (main) stopped.
(lldb) n

我是否犯了一些错误或滥用了bazel或vs代码?或者任何人都可以在vscode中提供配置json,它可以调试bazel项目?很高兴听到专业人士的任何建议和评论 .