lldb 不会停在我的断点上

dun*_*cks 5 lldb

我已经从具有完整调试信息的源代码(Clang IIUC 的默认构建类型)构建了 Clang 程序。我通过注意到模块中有编译单元来检查可执行文件中的调试信息是否可用:

$ lldb /opt/bin/clang++
(lldb) script lldb.target.module['/opt/bin/clang++'].GetNumCompileUnits()
1341
Run Code Online (Sandbox Code Playgroud)

我在 Clang 源代码树中检测了一个文件,lib/Sema/SemaExpr.cppSema::DiagnoseAssignmentResult方法中使用 printf 语句(在我的副本中的第 10853 行)。我知道我的测试文件会调用此方法test.cc,但我无法让调试器在此方法的断点处停止!我试过用两种方式设置断点,

$ lldb /opt/bin/clang++
(lldb) breakpoint set -m DiagnoseAssignmentResult
Breakpoint 2: where = clang++`clang::Sema::DiagnoseAssignmentResult(clang::Sema::AssignConvertType, clang::SourceLocation, clang::QualType, clang::QualType, clang::Expr*, clang::Sema::AssignmentAction, bool*) + 87 at SemaExpr.cpp:10858, address = 0x0000000100ab9947
(lldb) process launch -- ./test.cc
<< message from my printf statement >>
... then clang++ runs to completion and exits, no breakpoint hit ...
(lldb)
Run Code Online (Sandbox Code Playgroud)

我注意到lldb 确实在源代码中找到了正确的位置,但是当它通过方法时并没有停止。我还尝试通过指定文件和行号来设置断点,

(lldb) breakpoint set -f SemaExpr.cpp -l 10853
Breakpoint 3: where = clang++`clang::Sema::DiagnoseAssignmentResult(clang::Sema::AssignConvertType, clang::SourceLocation, clang::QualType, clang::QualType, clang::Expr*, clang::Sema::AssignmentAction, bool*) + 87 at SemaExpr.cpp:10858, address = 0x0000000100ab9947
Run Code Online (Sandbox Code Playgroud)

它再次“起作用”,但并没有停止。我在这里做错了什么吗?如何让断点触发?

Jim*_*ham 6

您正在调试 clang 驱动程序,这不是实际解析的内容。相反,clang 会产生另一个进程来进行编译,然后 ld 如果需要链接,等等。 lldb 没有在您的断点处停止,因为该代码实际上是由子进程运行的。这里令人困惑的一点是,clang 实际上为驱动程序和解析器使用了相同的二进制文件,因此断点采用了,只是不在将要调用该代码的 clang 版本中。

调试clang的编译部分的方法是先这样运行:

$ clang++ -### <all your other arguments>
Run Code Online (Sandbox Code Playgroud)

注意奇怪的 -### 参数。这告诉 clang 不要进行编译,而是发出将运行以进行编译的命令行。它看起来像:

/usr/bin/clang" "-cc1" ...
Run Code Online (Sandbox Code Playgroud)

所以这是你想在 lldb 中使用的命令行来调试 clang 作为编译器而不是 clang 作为编译器驱动程序......