【问题标题】:Can I call `operator[]` of the program directly in a gdb pretty printer?使用直接函数调用的 gdb 漂亮打印
【发布时间】:2012-01-24 14:04:00
【问题描述】:

我正在尝试使用 GDB 的漂亮打印工具来显示自定义 C++ 矩阵类。

该课程非常标准,您可以在任何地方找到。它是由类型参数化的模板,可以使用 mat[i][j] 等 C 类型表示法访问。这首先隐式返回另一个表示行或列的模板“Slice”类,可以再次由 [] 运算符访问以提取数据。该类本身使用普通的 C 数组进行存储,但它正在对其实施一些技巧,例如预分配更大矩阵的选项、启用非零开始、使用 stride 等。该类没有本机打印接口,我不能修改它,也不能轻易链接到我自己的代码。

自定义功能使得在 Python 中重现直接数据访问代码变得很痛苦。但这有必要吗?一般来说:为什么漂亮的打印要重现访问数据的逻辑?我不能只使用 C++ 调用并使用 [] 运算符来打印第 i,j 个元素吗?在此类请求期间,Slice 类在 GDB 中是临时的,这一事实使这一点更加复杂。

我也是 python 和 GDB 脚本的初学者。我试图破解示例以用 gdb.execute 调用替换数据访问,但我不知道如何从 to_string 函数访问对象名称,所以我可以使用类似 gdb.execute(??? + '[] +str(i)+']',假,真)。

我想知道最有效的方法是什么。

【问题讨论】:

    标签: c++ python gdb pretty-print


    【解决方案1】:

    我不能只使用 C++ 调用并使用 [] 运算符来打印第 i,j 个元素吗?

    您可以使用gdb.parse_and_eval (docs) 从漂亮打印机调用劣质(正在调试)进程,但这有几个缺点:

    • 您需要一个“实时”进程来执行此操作(换句话说,当您调试核心转储时,您的漂亮打印机将无法工作)
    • 如果劣质以某种方式损坏,调用其中的函数可能会进一步损坏它
    • 如果inferior是多线程的,并且漂亮的打印机调用了一个可能需要锁的函数(例如malloc),那么你很可能导致漂亮的打印机死锁,并且不会有任何从这种僵局中恢复的方法。

    【讨论】:

    • 任何人都可以举一个例子吗?
    【解决方案2】:

    这不是 python 脚本,而是简单的 command sequences 用于 GDB 扩展。我正在定义一个名为print_matrix 的新命令。

    (gdb) define print_matrix
    Type commands for definition of "print_matrix".
    End with a line saying just "end".
    >set $s_arr = $arg0
    >set $i=0
    >while($i < $arg1)
     >p (int [][$arg2]) *($s_arr + $i)
     >set $i = $i + 1
     >end
    >end
    (gdb) print_matrix arr 10 10
    $90 = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}
    $91 = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}
    $92 = {{2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}
    $93 = {{3, 4, 5, 6, 7, 8, 9, 10, 11, 12}}
    $94 = {{4, 5, 6, 7, 8, 9, 10, 11, 12, 13}}
    $95 = {{5, 6, 7, 8, 9, 10, 11, 12, 13, 14}}
    $96 = {{6, 7, 8, 9, 10, 11, 12, 13, 14, 15}}
    $97 = {{7, 8, 9, 10, 11, 12, 13, 14, 15, 16}}
    $98 = {{8, 9, 10, 11, 12, 13, 14, 15, 16, 17}}
    $99 = {{9, 10, 11, 12, 13, 14, 15, 16, 17, 18}}
    (gdb)
    

    您也可以将这些命令保存为脚本并使用 -x 选项

    gdb -x <commands file name> binary.out
    

    【讨论】:

    • 谢谢,但我需要使用漂亮的打印工具,因为它与 Eclipse 集成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多