我正在尝试使用GDB的漂亮打印工具来显示自定义C ++矩阵类。
这个课程非常标准,你可以在任何地方找到。它是一个按类型参数化的模板,可以用mat [i] [j]等C类表示法访问。这首先隐式返回表示行或列的另一个模板“Slice”类,[]运算符可以再次访问该类以提取数据。该类本身使用普通的C数组进行存储,但它正在实现一些技巧,比如预先分配更大的矩阵,启用非零启动,使用步幅等选项。该类没有本机打印接口,我无法修改它,或轻松链接我自己的代码。
自定义功能使得在Python中重现直接数据访问代码变得非常痛苦。但那有必要吗?一般来说:为什么漂亮的印刷会重现访问数据的逻辑?我不能只使用C ++调用并使用[]运算符来打印第i,第j个元素吗?在这样的请求期间,Slice类在GDB中是临时的,这一事实使这更加复杂。
我也是python和GDB脚本的初学者。我试图破解示例用gdb.execute调用替换数据访问,但我不知道如何从to_string函数访问对象名称,所以我可以使用类似gdb.execute(??? +'[]的东西+ str(i)+']',False,True)。
我想知道最有效的方法是什么。
答案 0 :(得分:5)
我不能只使用C ++调用并使用[]运算符来打印第i,第j个元素吗?
您可以使用gdb.parse_and_eval
(docs)从漂亮的打印机调用下级(正在调试),但这有几个缺点:
malloc
),那么你很可能会导致漂亮的打印机死锁,并且不会以任何方式从这种僵局中恢复过来。答案 1 :(得分:1)
这不是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