【问题标题】:LLDB How to set breakpoint whch stops when register == somevalue?LLDB如何设置当寄存器==某个值时停止的断点?
【发布时间】:2016-04-17 16:30:37
【问题描述】:

如何在 lldb 中设置断点,当 register == somevalue 时停止 (rdi = 0x0000000000000000)?有可能吗?

【问题讨论】:

    标签: debugging lldb


    【解决方案1】:

    lldb 表达式解析器提供$rdi$rsi 等作为寄存器值的便利变量。所以:

    (lldb) break modify -c "$rdi == 0x0000000000000000" <BKPT_NO>
    

    将完成这项工作。您还可以在设置断点时指定 -c(即 --condition)选项。

    注意,对于在寄存器中传递参数的架构,lldb 也有“$arg1”、“$arg2”等。这些只是 ABI 指定的参数传递寄存器的别名,所以如果你在中间的某个地方他们将不再保存参数值的函数。但是对于在函数开头设置断点,它们可以派上用场。

    【讨论】:

    • 没有函数名@Jim Ingham 怎么办?我提交了一个包含所有细节的错误:bugs.llvm.org/show_bug.cgi?id=47758
    • 这有点难。观察点没有帮助,因为它们用于数据总线,并且硬件断点是地址而不是基于指令内容的,所以它们也没有帮助。正如我在 bug 中所说,您可以尝试编写一个自定义断点解析器来扫描反汇编中的系统调用,并在您找到的所有系统调用的地址上设置断点。您可能需要进行一些过滤,但这应该可以帮助您入门。
    • $rdi 是任何寄存器的同义词吗?如果是,那么 $rsi 有什么用?
    • 情况正好相反。 $rdi 是 x86_64 上的真实寄存器名称。但是 lldb 对传递寄存器的参数有 $argN 别名,所以 $arg1 是 x86_64 上 $rdi 的别名,$arg2 是 $rsi 的别名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2021-05-27
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多