assembly - 有没有办法使用 lldb 获得标志寄存器的良好输出?

标签 assembly lldb disassembly

这是我使用 lldb 读取 rflags 寄存器时得到的输出

(lldb) register read rflags
  rflags = 0x0000000000000246

我知道每个位都代表一个特定的标志,但是如果有一个输出能够为我提供这些标志的值(例如进位标志、零标志等...),那就太好了

有没有办法使用 lldb 来做到这一点?

最佳答案

没有一种自动方法可以做到这一点。

您不能使用数据格式化程序,因为它们链接到类型并且没有“标志寄存器类型”。您可以在命令行上传递格式来注册读取格式化整个值。

我们曾考虑过添加与数据格式化程序相同的“寄存器格式化程序”,但尚未实现。

但是,您可以很容易地编写 lldb 命令来漂亮地打印该值。如果您从此处的示例开始:

http://llvm.org/svn/llvm-project/lldb/trunk/examples/python/cmdtemplate.py

您可以在此处看到示例获取框架:

frame = exe_ctx.GetFrame()

然后您可以从以下位置获取寄存器值:

rflags_value = frame.FindRegister("rflags")

您可以获取整体值

error = lldb.SBError()
uint_value = rflags_value.GetValueAsUnsigned(error)

但是对于您的目的来说,获取 SBData 可能会更容易:

data_value = rflags_value.GetData()

SBData 对象可让您将值视为 uint8 的向量。它不会产生更小的 block ,但这仍然可能有帮助:

first_byte = data_value.uint8[0]

等等。当您根据需要对其进行格式化后,将描述写入您传递的返回对象中,这就是命令将返回的内容。 __init 部分展示了如何将其变成 lldb 命令。然后只需输入:

command script import <path_to_py>/my_command.py

它将在您 future 的所有 lldb session 中可用。

以下是有关 lldb API 的更多文档:

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

您可以在 lldb 中使用 python“脚本解释器”REPL(script 命令)在开发代码时使用这些 API。

关于assembly - 有没有办法使用 lldb 获得标志寄存器的良好输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47682694/

相关文章:

c# - 在 C# 中访问安全资源

c - x86 过程调用内存分配

c - 限制在程序集文件中使用 #define'd 函数/内联函数

gdb - gdb 的 rwatch 的 lldb 等价物是什么?

ios - 使用PO命令调试

Xcode/lldb : stop application without symbols at entry into program

java - 是否有用于 java 的反汇编器 + 调试器(用于汇编器的 ala OllyDbg/SoftICE)?

c++ - 从 .o 目标文件中提取函数的原始机器代码?

c++ - 内存部分处理错误

ASM x86 FASM 中的函数参数