在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
答案 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的更多信息在这里:
答案 1 :(得分:0)
您可以将lldb调试器的形式更改为另一个形式
类型格式添加-f字节uint8_t
字节:要使用的格式 uiint8_t:键入要在其上应用格式
有关更多详细信息,请链接:-https://lldb.llvm.org/use/variable.html