【问题标题】:Is there a way to get a nice output for the flags register using lldb?有没有办法使用 lldb 为标志寄存器获得一个不错的输出?
【发布时间】:2018-05-20 19:55:47
【问题描述】:

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

(lldb) register read rflags
  rflags = 0x0000000000000246

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

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

【问题讨论】:

  • 您可能已经知道gdb 有这个:使用layout reg,显示寄存器的TUI 窗口包括eflags 0x246 [ PF ZF IF ],当它改变时会突出显示。 info reg eflags 给出了同样的结果。 p $eflags 也显示解码结果。 p /x $eflags 以数字形式显示。 (奇怪的是,gdb 不识别 rflags,仅将 eflags 识别为 x86-64 的注册名称。)

标签: assembly lldb disassembly


【解决方案1】:

没有自动的方法来做到这一点。

您不能使用数据格式化程序,因为它们链接到类型并且没有“标志寄存器类型”。并且可以在命令行中传递给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

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

【讨论】:

    【解决方案2】:

    正如前面的回答所解释的,没有内置的方法,但你可以制作一个脚本。

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

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

    Here, on my gist

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 2019-01-31
      • 2013-01-18
      相关资源
      最近更新 更多