每当调试器内调用的函数崩溃时禁用 LLDB 恢复状态

Disable LLDB restoring state whenever a function called within debugger is crashed

我正在使用 LLDB 调试器调试 C 项目。

我将调试器附加到一个程序,然后调用调试器中的一些函数,这些函数预计会崩溃。我想知道这个函数在哪里崩溃。

问题是 - 由于函数是从调试器内部调用的,一旦函数崩溃,调试器会将状态重置回调用函数之前的状态。我不想要这个,知道如何禁用它吗?

这是我从 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 中正常停止时一样。当您完成此调查并希望将线程 return 恢复到调用表达式之前的状态时,请使用命令:

thread return -x

线程嵌套调用表达式;您可以调用一个表达式,在它崩溃时停止,调用另一个崩溃的表达式,在它崩溃时停止,等等...thread return -x 将展开最年轻的表达式崩溃。

在相关说明中,您还可以在表达式解析器中调用的函数中设置断点,命中断点,然后单步执行表达式求值的其余部分。这在默认情况下也不打开,但由 -i 标志控制为 expr,例如:

expr -i 0 -- <expression>

检查完调用的代码后,您可以使用 thread return -x 从线程堆栈中擦除表达式求值,或者您可以 continue 并且表达式将完成求值结果将被打印出来。

这个技巧对于观察函数如何处理奇数输入等非常方便