【问题标题】:lldb not stopping on my breakpointlldb 没有在我的断点处停止
【发布时间】:2014-08-01 09:06:00
【问题描述】:

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

$ lldb /opt/bin/clang++
(lldb) script lldb.target.module['/opt/bin/clang++'].GetNumCompileUnits()
1341

我在 Clang 源代码树 lib/Sema/SemaExpr.cpp 中使用了 Sema::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)

我注意到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

它再次“工作”,但没有停止。我在这里做一些根本错误的事情吗?如何让断点触发?

【问题讨论】:

    标签: lldb


    【解决方案1】:

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

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

    $ clang++ -### <all your other arguments>
    

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

    /usr/bin/clang" "-cc1" ...
    

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

    【讨论】:

    • 啊哈!谢谢,那行得通,但是我的做法似乎很讨厌。我用这个邪恶的混乱抓住命令行:/opt/bin/clang++ -### ./test1.cc 2&gt;&amp;1 | sed 's/"//g' | grep 'bin/clang',然后将结果作为参数复制并粘贴到lldb,如下所示:lldb -- &lt;unholy mess&gt;。然后我的调试会话工作。但这似乎很幼稚,有没有更好的方法?
    • 为什么需要 sed 和 grep?只需运行“clang -###”命令,复制结果,输入“lldb --”,然后粘贴并按回车即可。
    • 啊,天啊,在我仓促的兴奋中,我没有意识到还有其他东西被打印出来,比如 Apple 标头和链接器命令会抛出 lldb 关闭。认为引号可能是问题所在,但现在我已经学会了如何调试 clang 并了解了更多关于 shell 如何工作的信息。哇! :-) 再次感谢。
    • 你拯救了我的一天。我今天一直在解决同样的问题,但使用的是 Swift 编译器。
    猜你喜欢
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2021-12-18
    相关资源
    最近更新 更多