gpt4 book ai didi

lldb 没有在我的断点处停止

转载 作者:行者123 更新时间:2023-12-01 12:40:43 28 4
gpt4 key购买 nike

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

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

我在 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)

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

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

最佳答案

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

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

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

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

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

关于lldb 没有在我的断点处停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25076625/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com