在LLDB中将字节数组格式化为C-89初始化表达式

时间:2014-02-15 06:05:27

标签: c arrays formatting lldb

我有一个用常规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初始化程序?

3 个答案:

答案 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')

如果您只想查看结构或数组的所有元素,而不是以结果形式查看结构或数组的所有元素,这通常很有用。

相关问题