【问题标题】:LLDB Breakpoint Commands and FinishLLDB 断点命令和完成
【发布时间】:2019-05-09 10:40:06
【问题描述】:

是否可以在运行“继续”命令后在断点后运行命令。例如,我会这样做:

br set -n function -C finish -C something_else

然后我得到一个错误

error: Aborting reading of commands after command #1: 'finish' continued the target.

人们如何解决这个问题?我想我可以在返回指令处设置另一个断点,并作为其命令的一部分使其自行删除,但我无法知道我需要删除的 bp 的 id。另外,这是一个条件断点,所以我不能总是在 return 指令上中断,也不能有条件地在 return 指令上中断,因为我用来中断函数的上下文已经消失。

【问题讨论】:

    标签: lldb


    【解决方案1】:

    您目前无法执行此操作。 lldb 命令解释器不可重入,因为您的finish 很可能使用自己的命令命中另一个断点,当其中一个继续执行时,lldb 退出读取第一组断点命令。

    您不需要在其命令中删除返回断点,只需将其设置为一次性断点(break set -o true),当它被击中时,它将自行删除。

    注意,如果您的程序是多线程的,并且您在代码中停止了许多线程可能同时通过,您确实需要为当前线程设置特定线程的返回断点。在 lldb 命令行中这实际上有点棘手,但您可以使用 Python 断点回调很容易地做到这一点:

    https://lldb.llvm.org/use/python-reference.html#running-a-python-script-when-a-breakpoint-gets-hit

    【讨论】:

    • 我最终总是在返回指令上设置一个断点,然后只使用 python + 由 thread_id 索引的全局状态来检查是否满足先前的条件。 python bp 回调似乎在 95% 的时间里都能正常工作,但在存在多个线程的情况下似乎很活跃。我运行了一个超级简单的测试用例,它只是 pthread(x()); x() 并在 x 函数上设置了一个 bp,即使两个函数都运行,大多数时候也只会达到 1 bp。这似乎是因为 lldb 是面向进程而不是面向线程的。
    • 如果你想要一个 Python 断点命令“继续”,你不应该在断点命令中使用 SBProcess.Continue()。 SBProcess.Continue 确实 - 正如它所说 - 实际上继续该过程。因此,调用它的第一个断点将阻止所有其他命令运行。相反,您应该从断点命令返回“False”。这就是说“这个线程投票继续”,如果在处理完所有其他命令后没有其他人投票停止,那么该过程将继续。这在 Python 参考中有所描述。
    猜你喜欢
    • 2018-01-09
    • 2014-07-20
    • 2017-03-28
    • 2014-09-03
    • 2013-04-27
    • 2016-11-13
    • 2014-12-25
    • 2022-01-23
    • 2014-05-06
    相关资源
    最近更新 更多