有没有办法使用 lldb 为标志寄存器获得良好的输出?
Is there a way to get a nice output for the flags register using lldb?
这是我使用 lldb
读取 rflags 寄存器时得到的输出
(lldb) register read rflags
rflags = 0x0000000000000246
我知道每一位都代表一个特定的标志,但如果能有一个输出给我这些标志的值(例如进位标志、零标志等...)就更好了
有没有办法使用 lldb 做到这一点?
没有自动执行此操作的方法。
您不能使用数据格式化程序,因为它们链接到类型并且没有 "flags register type"。您可以在命令行上传递的格式 register read
格式化整个值。
我们考虑过添加 "register formatters" 与数据格式化程序相同的想法,但尚未实现。
不过,您可以很容易地编写一个 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]
等当你按照你的意愿格式化它时,将描述写入你传递的 return 对象,这就是命令将要 return 的内容。 __init 部分展示了如何将其变成 lldb 命令。然后输入:
command script import <path_to_py>/my_command.py
它将在您未来的所有 lldb 会话中可用。
这里有更多关于 lldb API 的文档:
http://lldb.llvm.org/python_reference/index.html
并且您可以在 lldb 中使用 python "script interpreter" REPL(script
命令)在开发代码时使用这些 API。
正如前面的回答所解释的那样,没有内置的方法,但你可以制作一个脚本。
所以,我为此制作了一个 lldb python 脚本。
支持flags/eflags/rflags,您可以为其添加自定义命令。
这是我使用 lldb
读取 rflags 寄存器时得到的输出(lldb) register read rflags
rflags = 0x0000000000000246
我知道每一位都代表一个特定的标志,但如果能有一个输出给我这些标志的值(例如进位标志、零标志等...)就更好了
有没有办法使用 lldb 做到这一点?
没有自动执行此操作的方法。
您不能使用数据格式化程序,因为它们链接到类型并且没有 "flags register type"。您可以在命令行上传递的格式 register read
格式化整个值。
我们考虑过添加 "register formatters" 与数据格式化程序相同的想法,但尚未实现。
不过,您可以很容易地编写一个 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]
等当你按照你的意愿格式化它时,将描述写入你传递的 return 对象,这就是命令将要 return 的内容。 __init 部分展示了如何将其变成 lldb 命令。然后输入:
command script import <path_to_py>/my_command.py
它将在您未来的所有 lldb 会话中可用。
这里有更多关于 lldb API 的文档:
http://lldb.llvm.org/python_reference/index.html
并且您可以在 lldb 中使用 python "script interpreter" REPL(script
命令)在开发代码时使用这些 API。
正如前面的回答所解释的那样,没有内置的方法,但你可以制作一个脚本。
所以,我为此制作了一个 lldb python 脚本。
支持flags/eflags/rflags,您可以为其添加自定义命令。