我从源代码构建了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
它再次“奏效”,但并未停止 . 我在这里做了一些根本错误的事吗?如何触发断点?