我已经从具有完整调试信息的源(Clang IIUC的默认构建类型)构建了Clang程序。我通过注意模块中有编译单元来检查可执行文件中是否有可用的调试信息:
$ lldb /opt/bin/clang++
(lldb) script lldb.target.module['/opt/bin/clang++'].GetNumCompileUnits()
1341
我已经在Clang源代码树lib/Sema/SemaExpr.cpp
中使用Sema::DiagnoseAssignmentResult
方法(在我的副本中的第10853行)中使用printf语句检测了一个文件。我知道这个方法会在我的测试文件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)
我注意到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
它再次&#34;工作&#34;,但不会停止。我在这里做了一些根本错误的事吗?如何触发断点?
答案 0 :(得分:3)
您正在调试clang驱动程序,这实际上不是解析。相反,clang会产生另一个进程进行编译,然后ld如果需要链接等等.lldb没有停在断点处,因为该代码实际上是由子进程运行的。这里令人困惑的一点是clang实际上对驱动程序和解析器使用了相同的二进制文件,因此断点占用了,而不是在将要调用该代码的clang版本中。
调试clang的编译部分的方法是首先运行它:
$ clang++ -### <all your other arguments>
注意奇怪的 - ###参数。这告诉clang不要进行编译,而是发出它将运行以进行编译的命令行。它看起来像:
/usr/bin/clang" "-cc1" ...
这是你想在lldb中使用的命令行来调试clang作为编译器,而不是作为编译器驱动程序铿锵......