【问题标题】:Formatting a byte array as a C-89 initializer expression in LLDB在 LLDB 中将字节数组格式化为 C-89 初始化表达式
【发布时间】:2014-02-15 06:05:26
【问题描述】:

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

【问题讨论】:

  • 我现在没有,但试试这个文档lldb.llvm.org/varformats.html 看看那个以简单格式打印数组的例子,看看它是如何完成的。否则可能会尝试编写自己的自定义格式

标签: c arrays formatting lldb


【解决方案1】:

您可以编写一个 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
}

【讨论】:

  • 如果您在“type summary add”命令中添加“-v”标志,它将只显示摘要,而不是冗余数组版本。
【解决方案2】:

使用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 复制并粘贴到您的源代码中(当然需要添加最后的分号)。

【讨论】:

    【解决方案3】:

    另一个无需了解任何 Python 即可获得与 Jason 展示的几乎相同内容的快速方法是使用 -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')
    

    如果您有某种类型,您只想像这样“平面”地查看结构或数组的所有元素,而不是原来的形式,这通常很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 2022-01-21
      • 1970-01-01
      • 2021-05-15
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多