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