我有一个用常规C89初始化程序初始化的数组:
uint8_t data[] = {0x05,0x48,0x45,0x4c,0x4c,0x4f,0x01,0x00 ... }
当我在lldb中打印这个数组时,我得到了这个怪物:
(lldb) p data
(uint8_t [200]) $0 = {
[0] = '\x05'
[1] = 'H'
[2] = 'E'
[3] = 'L'
[4] = 'L'
[5] = 'O'
[6] = '\x01'
...
我正在尝试将lldb的输出强制转换为原始C89语法,因此我可以简单地将lldb中的数据内容粘贴回我的代码中(例如,我可以编写使用我在调试期间捕获的数组的单元测试)。
如何告诉lldb将其输出格式化为普通的C89初始化程序?
答案 0 :(得分:0)
使用type format add -f x uint8_t
得到你想要的东西:
(lldb) p data
(uint8_t [8]) $4 = {
[0] = 0x05
[1] = 0x48
[2] = 0x45
[3] = 0x4c
[4] = 0x4c
[5] = 0x4f
[6] = 0x01
[7] = 0x00
}
你只需要在每一行之后添加“,”以获得将编译的源代码行(对于数组)。如果这太麻烦了,我怀疑你必须在python中写一些东西。
要查看其他格式(除了上面使用的“x”,代表十六进制),请使用help format
。
编辑:按照Brandin的上述提示,事实证明你可以通过另外使用
以你想要的方式格式化你的阵列(lldb) type summary add --summary-string "," uint8_t
这将在每行之后添加“,”:
(lldb) p data
(uint8_t [8]) $3 = {
[0] = 0x05 ,
[1] = 0x48 ,
[2] = 0x45 ,
[3] = 0x4c ,
[4] = 0x4c ,
[5] = 0x4f ,
[6] = 0x01 ,
[7] = 0x00 ,
}
你可以复制&将1:1粘贴到源代码中(当然需要添加最后的分号)。
答案 1 :(得分:0)
您可以编写一个python摘要打印机以正确的格式打印数组的内容,但传递给python的SBValue
对象将没有可用变量的名称。
(lldb) type summ add uint8_t[] -P
[...]
print '{',
for i in xrange(0, valobj.GetNumChildren()):
print '0x%02x' % valobj.GetChildAtIndex(i).GetValueAsUnsigned(),
if (i != valobj.GetNumChildren() - 1):
print ',',
print '};'
DONE
(lldb) p data
{ 0x05 , 0x48 , 0x45 , 0x4c , 0x4c , 0x4f , 0x01 , 0x00 };
(uint8_t [8]) $1 = {
[0] = 0x05
[1] = 0x48
[2] = 0x45
[3] = 0x4c
[4] = 0x4c
[5] = 0x4f
[6] = 0x01
[7] = 0x00
}
答案 2 :(得分:0)
Jason在不必知道任何Python的情况下表现出来的另一种快速方法就是使用-c和-O选项来输入摘要添加,例如:
(lldb) type summary add -c -O uint8_t[]
(lldb) expr array
(uint8_t [8]) $2 = ('\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\a', '\b')
如果您只想查看结构或数组的所有元素,而不是以结果形式查看结构或数组的所有元素,这通常很有用。