lldb:将数组显示为十六进制

时间:2018-08-03 14:37:01

标签: lldb

在lldb中,是否可以以串联的十六进制显示uint8_t字节数组?

例如,显示here中描述的uint256类型的默认行为是

{
  [14] = '['
  [15] = '\xbf'
  [16] = '('
  [17] = '\xc3'
  [18] = 'O'
  [19] = ':'
  [20] = '^'
  [21] = '3'
  [22] = '*'
  [23] = '\x1f'
  [24] = '\xc7'
  [25] = '\xb2'
  [26] = '\xb7'
  [27] = '<'
  [28] = '\xf1'
  [29] = '\x88'
  [30] = '\x91'
  [31] = '\x0f'
}

通过运行type summary add --summary-string "${var.data[0-31]%x}" uint256,我可以这样显示它:

[0x06,0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f]

但是我想要这样的东西:

0x06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f

2 个答案:

答案 0 :(得分:1)

我想不出使用摘要字符串格式化程序执行此操作的方法。我们为char []做了一些特殊的魔术,但这是您不需要的%s说明符的后面。

但是,编写一个python摘要来做到这一点相当容易。这是uint8_t类型[32]的简单示例:

def unvector_32 (valobj,internal_dict):
    str = "0x" 
    for i in range(0,31): 
         str += ("%x"%(valobj.GetChildAtIndex(i).GetValueAsUnsigned())).zfill(2) 
    return str

def __lldb_init_module(debugger, internal_dict):
    debugger.HandleCommand('type category define -e my_formatters')
    debugger.HandleCommand('type summary add -w my_formatters -F %s.unvector_32 "uint8_t [32]" -v'%(__name__))

将其放在.py文件中的某个位置(我将所有这些都放入〜/ .lldb中)并执行:

(lldb) com scr imp ~/.lldb/my_formatters.py

在您的lldb会话中或在您的〜/ .lldbinit中。然后您将看到:

(lldb) fr v data
(uint8_t [32]) data = 0x01020304050600000000000000000000000000000000000000000000000000
(lldb)

我认为这大致就是您想要的输出。要将其应用于uint256类,可以在添加摘要时将匹配类型更改为“ uint256”,并让摘要功能首先使用data获取GetChildMemberWithName("data")成员,然后打印各个矢量元素。如果希望格式化程序更通用,也可以对uint([0-9] +)使用正则表达式匹配,然后通过data调用获取GetNumChildren中的元素数...

顺便说一句,我很方便将所有格式器放在一个类别中,这样我就可以轻松列出它们(type summary list -w my_formatters),如果我搞砸了,也可以很容易地将它们全部关闭...

有关SB API的更多信息在这里:

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

答案 1 :(得分:0)

您可以将lldb调试器的形式更改为另一个形式

类型格式添加-f字节uint8_t

字节:要使用的格式 uiint8_t:键入要在其上应用格式

有关更多详细信息,请链接:-https://lldb.llvm.org/use/variable.html