【发布时间】:2020-05-06 06:55:11
【问题描述】:
我正在使用 LLDB 调试器调试 C 项目。
我将调试器附加到程序,然后调用调试器中的一些函数,这些函数预计会崩溃。我想知道这个函数在哪里崩溃。
问题是 - 由于函数是从调试器内部调用的,一旦函数崩溃,调试器会将状态重置回调用函数之前的状态。我不想要这个,知道如何禁用它吗?
这是我从 lldb 调试器得到的消息
谢谢
【问题讨论】:
标签: lldb
我正在使用 LLDB 调试器调试 C 项目。
我将调试器附加到程序,然后调用调试器中的一些函数,这些函数预计会崩溃。我想知道这个函数在哪里崩溃。
问题是 - 由于函数是从调试器内部调用的,一旦函数崩溃,调试器会将状态重置回调用函数之前的状态。我不想要这个,知道如何禁用它吗?
这是我从 lldb 调试器得到的消息
谢谢
【问题讨论】:
标签: lldb
当表达式以两种方式崩溃时,您可以让 lldb 保留线程的状态。
1) 如果您想在表达式崩溃时始终停止在崩溃状态,请将设置 target.process.unwind-on-error-in-expressions 设置为 false:
settings set target.process.unwind-on-error-in-expressions false
在命令行或~\.lldbinit 文件中。
顺便说一句,出于这个原因,如果您正在使用 lldb SB API 编写脚本,或者您正在编写自己的调试器 GUI,并且您需要出于某种目的调用函数,那么在调用时显式覆盖此设置是个好主意职能。为此,请使用 SBExpressionOptions.SetUnwindOnErrors 方法。否则,您的用户可能会在他们没有调用的表达式中看到崩溃……
2) 您可以在每个表达式的基础上使用:
expr -u 0 -- <expression>
注意,如果您经常这样做,您可以为此创建一个别名。比如:
command alias pu expr -u 0 --
那就这样吧:
pu <expression>
在表达式崩溃时停止时,您可以检查堆栈、局部变量、调用其他表达式等,就像在 lldb 中正常停止一样。当您完成此调查并希望将线程返回到调用表达式之前的状态时,请使用以下命令:
thread return -x
在线程嵌套上调用表达式;你可以调用一个表达式,在它崩溃时停止,调用另一个崩溃的表达式,在它崩溃时停止,等等...thread return -x 将展开最年轻的表达式崩溃。
在相关说明中,您还可以在表达式解析器中调用的函数中设置断点,点击断点,然后逐步执行表达式评估的其余部分。这也不是默认开启的,而是由-i 标志控制到expr,例如:
expr -i 0 -- <expression>
检查完调用的代码后,您可以使用thread return -x 从线程堆栈中擦除表达式求值,也可以使用continue,表达式将完成求值并打印结果.
这个技巧对于观察函数在奇数输入等情况下的行为非常方便。
【讨论】: