用直接函数调用gdb漂亮打印

问题描述:

我想用GDB的漂亮打印工具来显示自定义C++矩阵类。用直接函数调用gdb漂亮打印

该课程相当标准,您可以在任何地方找到。它是一个由类型参数化的模板,可以使用C型符号(如mat [i] [j])进行访问。这首先隐式返回表示行或列的另一个模板“Slice”类,它可以再次由[]运算符访问以提取数据。这个类本身使用一个普通的C数组进行存储,但它正在实现一些技巧,比如预先分配一个更大的矩阵,启用非零启动,使用步长等。该类没有本地打印界面,我无法修改它,或者轻松链接我自己的代码。

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

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

我想知道做这件事最有效的方法是什么。

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

您可以从漂亮的打印机调入下(正在调试)使用gdb.parse_and_evaldocs)的过程,但是这有几个缺点:

  • 你需要一个“活”的过程中要做到这一点(换句话说,当你正在调试核心转储时,你漂亮的打印机将无法工作)
  • 如果劣势在某种程度上被破坏,调用它的函数可能会更多地损坏它
  • 如果劣势是多 - 线程和漂亮的prin ter调用可能需要锁定的函数(例如, malloc),那么你很可能会导致美丽的打印机死锁,并且没有任何办法可以从这种死锁中恢复过来。
+2

任何人都可以拼凑一个例子吗? – takbal 2012-01-10 10:17:12

这不是python脚本,但是用于GDB扩展的简单command sequences。我正在定义一个名为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 
+0

谢谢,但我需要使用漂亮的打印工具,因为它与Eclipse集成。 – takbal 2012-01-10 10:15:51