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 因为您明确不想一个一个地查看元素 - 这是数组的自然值。
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 因为您明确不想一个一个地查看元素 - 这是数组的自然值。