【问题标题】:lldb: one line output for `print` and `display`lldb:`print` 和 `display` 的一行输出
【发布时间】:2015-07-09 21:04:34
【问题描述】:

例如用源码main.c:

#include <stdio.h>

int main()
{
    int a[10] = {0,1,2,3,4,5,6,7,8,9};
    int b = 2;
    printf("line 7\n");
    printf("line 8\n");
    return 0;
}

使用LLDB 调试器,print a 产生:

(int [10]) $0 = {
  [0] = 0
  [1] = 1
  [2] = 2
  [3] = 3
  [4] = 4
  [5] = 5
  [6] = 6
  [7] = 7
  [8] = 8
  [9] = 9
}

问题 0:我怎样才能在一行上为 print 获得紧凑的打印,就像 GDB 一样:

$1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

使用LLDB 调试器,display adisplay b 产生:

- Hook 1 (expr -- a)
(int [10]) $0 = {
  [0] = 0
  [1] = 1
  [2] = 2
  [3] = 3
  [4] = 4
  [5] = 5
  [6] = 6
  [7] = 7
  [8] = 8
  [9] = 9
}

- Hook 2 (expr -- b)
(int) $1 = 2

问题 1:我怎样才能在两行上紧凑打印 display,就像 GDB 一样:

2: b = 2
1: a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

【问题讨论】:

  • 我不知道答案,但你为什么要那个?
  • 顺便说一句,很好的问题索引... :-)
  • @SouravGhosh 我正在调试代码并希望显示 17 个变量。在 GDB 中,输出为 12 行。在 LLDB 中,很多行,而且很难阅读,我必须滚动屏幕
  • Mine 为整个数组打印一行。你的~/.lldbinit 里有什么?
  • @user744629:我的是 lldb-330.0.48。见my output

标签: c macos lldb


【解决方案1】:

默认情况下,决定哪些类型可以“单行”打印是硬编码在 FormatManager::ShouldPrintAsOneLiner

用户可以调整的唯一设置是

(lldb) settings show auto-one-line-summaries
auto-one-line-summaries (boolean) = true

充当该功能的全局终止开关(true 表示“允许”)

快速解决您的问题的方法是手动为所有 int 数组添加摘要,因此:

(lldb) type summary add -x "int \[[0-9]+]" -c

也就是说,对于名称与正则表达式 int [ 后跟一个或多个数字后跟一个 ] 匹配的所有类型,然后强制单行格式化

这样我就明白了

(lldb) fr var x
(int [10]) x = ([0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 5, [6] = 6, [7] = 7, [8] = 8, [9] = 9)
(lldb) expr x
(int [10]) $2 = ([0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 5, [6] = 6, [7] = 7, [8] = 8, [9] = 9)

综上所述,我认为您使用的是旧版本的 LLDB

在一个相当新的调试器版本中,即使没有自定义格式,我也会得到单行显示:

(lldb) expr x
(int [10]) $0 = ([0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 5, [6] = 6, [7] = 7, [8] = 8, [9] = 9)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    相关资源
    最近更新 更多