有没有办法使用lldb为标志寄存器获得一个很好的输出?

时间:2017-12-06 20:11:57

标签: assembly lldb disassembly

这是我使用lldb

读取rflags寄存器时得到的输出
(lldb) register read rflags
  rflags = 0x0000000000000246

我知道每个位代表一个特定的标志,但是输出会给我这些标志的值(例如进位标志,零标志等等)会很好。

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

2 个答案:

答案 0 :(得分:2)

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

您不能使用数据格式化程序,因为它们与类型相关联,并且没有#34;标记寄存器类型"。您可以在命令行上传递给register read的格式格式化整个值。

我们已经想到了添加"注册格式化程序"与数据格式化程序一样,但尚未实现。

你可以很容易地写一个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的向量。它不会产生较小的块,但这仍然有帮助:

first_byte = data_value.uint8[0]

等。根据需要对其进行格式化后,将描述写入您传递的返回对象,以及该命令将返回的内容。 __init部分显示了如何将其变为lldb命令。然后就这样说:

command script import <path_to_py>/my_command.py

它将在您未来的所有lldb会话中提供。

这里有关于lldb API的更多文档:

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

你可以使用python&#34;脚本解释器&#34;在开发代码时,使用lldb中的REPL(script命令)来使用这些API。

答案 1 :(得分:0)

正如之前的回答所解释的那样,没有内置方式,但你可以创建一个脚本。

所以,我为此制作了一个lldb python脚本。

支持flags / eflags / rflags,您可以为它添加自定义命令。

Here, on my gist