lldb 能否更有效地显示结构中的 char * / 字符串?

Can lldb display char * / strings in structs more efficiently?

lldb 习惯于以非常分散的方式向我显示字符串,这有点烦人,但不会妨碍显示。但也许有人已经知道如何使用它的显示尺寸来提高效率:

示例:

(lldb) p *tq
(taskq_t)  = {
  tq_name = {
    [0] = 's'
    [1] = 'y'
    [2] = 's'
    [3] = 't'
    [4] = 'e'
    [5] = 'm'
    [6] = '_'
    [7] = 't'
    [8] = 'a'
    [9] = 's'
    [10] = 'k'
    [11] = 'q'
    [12] = '[=10=]'
    [13] = '[=10=]'
    [14] = '[=10=]'
    [15] = '[=10=]'
    [16] = '[=10=]'
    [17] = '[=10=]'
    [18] = '[=10=]'
    [19] = '[=10=]'
    [20] = '[=10=]'
    [21] = '[=10=]'
    [22] = '[=10=]'
    [23] = '[=10=]'
    [24] = '[=10=]'
    [25] = '[=10=]'
    [26] = '[=10=]'
    [27] = '[=10=]'
    [28] = '[=10=]'
    [29] = '[=10=]'
    [30] = '[=10=]'
    [31] = '[=10=]'
  }
  tq_lock = {

更喜欢:

(lldb) p *tq
(taskq_t)  = {
  tq_name = {
    "system_taskq[=11=]"
  }
  tq_lock = {

或类似的 - 如字符串。因为它在 char path[MAXPATH].

时变得很长

显示所有元素是数组的自然视图,并且由于不能保证 char 数组实际上是一个以 null 结尾的字符串,因此即使将 char 数组打印为数组也是一个合理的默认值。但是正如您所观察到的,如果您知道该数组包含一个空终止字符串,您确实希望更紧凑地打印它。

幸运的是,lldb 有一个系统可以提供数据对象的“替代”视图。这就是为什么,例如你看到:

* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100003f0b has_char`main at has_char.c:8
   5    {
   6      char *myStr = "some string here";
   7      char myArr[20] = {'s', 'o', 'm', 'e', ' ', 's', 0};
-> 8      return strlen(myStr) + strlen(myArr); 
                        ^
   9    }
Target 0: (has_char) stopped.
(lldb) v myArr
(char [20]) myArr = "some s"

默认情况下,lldb 将 char[NN] 数组呈现为空终止字符串。

这是使用 lldb 的“摘要格式化程序”完成的。这里有更多关于它们的信息:

https://lldb.llvm.org/use/variable.html

您可以了解特定变量如何获得其格式,这在您寻找要复制的内容时有时很有用,方法是:

(lldb) type summary info myArr
summary applied to (char [20]) myArr is: `${var%s}` (hide value) (skip pointers)

摘要由类型名称或类型正则表达式注册,然后在打印时应用于该类型的任何值。它们也遵循 typedef 链,因此将为类型为已注册类型的 typedef 的变量提供相同的摘要。 [=39=是什么类型的,貌似只是一个char数组?我有点惊讶你必须在这里做任何事情...

无论如何,不​​用担心,您可以随时为您的类型明确添加一个。

命令是:

(lldb) 类型摘要添加 -s ${var%s} -p -v TypeNameOfTQ

-s 是摘要字符串,有关更多信息,请参阅上面引用的文档。

-p 因为你不想用这种方式格式化 char [10]*。

-v 因为您明确不想一个一个地查看元素 - 这是数组的自然值。