【问题标题】:Disable LLDB restoring state whenever a function called within debugger is crashed每当在调试器中调用的函数崩溃时,禁用 LLDB 恢复状态
【发布时间】:2020-05-06 06:55:11
【问题描述】:

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

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

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

这是我从 lldb 调试器得到的消息

谢谢

【问题讨论】:

    标签: lldb


    【解决方案1】:

    当表达式以两种方式崩溃时,您可以让 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,表达式将完成求值并打印结果.

    这个技巧对于观察函数在奇数输入等情况下的行为非常方便。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2011-01-18
      相关资源
      最近更新 更多