【问题标题】:LLDB Memory or read write on runtimeLLDB 内存或运行时读写
【发布时间】:2019-04-02 14:21:05
【问题描述】:

在玩过 lldb 之后,我想探索一种在条件自动应用(断点)时写入寄存器或内存值的方法。

lldb 有这样的功能吗?

谢谢

【问题讨论】:

    标签: lldb


    【解决方案1】:

    lldb 断点有条件和命令。条件(break setbreak modify-c 选项)是在断点命中的帧上下文中评估的 C (ObjC/C++) 表达式。

    这些命令(添加了breakpoint command add)只有在条件评估为真时才会运行。因此,如果您可以将条件表示为表达式,并将操作表示为一系列固定的 lldb 命令,那么您可以通过这种方式实现您想要的行为。

    您还可以在 Python 中编写断点命令(breakpoint command add -s python 使用 SB API:

    https://lldb.llvm.org/python_reference/index.html

    因此,如果您希望在更复杂的条件下进行更改或执行更复杂的操作,则可以使用 Python API 完成这些任务。

    【讨论】:

    • 我可以使用 print lldb.frame.registers 打印整个寄存器,但是如何只打印一个寄存器 x0?
    • 这是一个单独的问题,在评论中有点难以回答......简而言之,框架的“寄存器”对象是一个 SBValueList。列表中的每个元素都有一个名称 - 使用它来查找您想要的集合。列表的第一个元素是 GPR 寄存器。寄存器集存储为 SBValue,每个实际寄存器都是该值的子值。您可以按名称或索引查找它们。例如lldb.frame.registers[0].GetChildMemberWithName("x0") 打印 x0 的值。有关更多信息,请参阅lldb.llvm.org/python_reference/lldb.SBValueList-class.html 上有关 SBValueList 的文档。
    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多