每当调试器内调用的函数崩溃时禁用 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
并且表达式将完成求值结果将被打印出来。
这个技巧对于观察函数如何处理奇数输入等非常方便
我正在使用 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
并且表达式将完成求值结果将被打印出来。
这个技巧对于观察函数如何处理奇数输入等非常方便