Mat*_*ent 6 assembly disassembly lldb
这是我使用 lldb 读取 rflags 寄存器时得到的输出
(lldb) register read rflags
rflags = 0x0000000000000246
Run Code Online (Sandbox Code Playgroud)
我知道每一位代表一个特定的标志,但是如果有一个输出给我这些标志的值(例如进位标志、零标志等)会很好。
有没有办法使用 lldb 做到这一点?
没有一种自动方法可以做到这一点。
您不能使用数据格式化程序,因为它们链接到类型并且没有“标志寄存器类型”。您可以在命令行上传递格式来register read格式化整个值。
我们曾考虑过添加与数据格式化程序相同的“寄存器格式化程序”,但尚未实现。
然而,您可以很容易地编写一个 lldb 命令来漂亮地打印该值。如果您从此处的示例开始:
http://llvm.org/svn/llvm-project/lldb/trunk/examples/python/cmdtemplate.py
您可以在此处看到示例获取框架:
frame = exe_ctx.GetFrame()
Run Code Online (Sandbox Code Playgroud)
然后您可以从以下位置获取寄存器值:
rflags_value = frame.FindRegister("rflags")
Run Code Online (Sandbox Code Playgroud)
您可以获取整体值
error = lldb.SBError()
uint_value = rflags_value.GetValueAsUnsigned(error)
Run Code Online (Sandbox Code Playgroud)
但对于您的目的来说,获取 SBData 可能会更容易:
data_value = rflags_value.GetData()
Run Code Online (Sandbox Code Playgroud)
SBData 对象让您可以将值视为 uint8 的向量。它不会产生更小的块,但这仍然可能有帮助:
first_byte = data_value.uint8[0]
Run Code Online (Sandbox Code Playgroud)
当您根据需要对其进行格式化后,将描述写入您传递的返回对象中,这就是命令将返回的内容。__init 部分展示了如何将其变成 lldb 命令。然后只需输入:
command script import <path_to_py>/my_command.py
Run Code Online (Sandbox Code Playgroud)
并且它将在您未来的所有 lldb 会话中可用。
以下是有关 lldb API 的更多文档:
http://lldb.llvm.org/python_reference/index.html
您可以在 lldb(命令)中使用 python“脚本解释器”REPLscript在开发代码时使用这些 API。