我正在尝试使用 GDB 漂亮的打印功能来显示自定义 C++ 矩阵类。
该课程非常标准,您可以在任何地方找到。它是一个由类型参数化的模板,可以通过像 mat[i][j] 这样的 C 类型表示法来访问。首先隐式返回另一个表示行或列的模板“Slice”类,它可以再次由 [] 运算符访问以提取数据。该类本身使用普通的 C 数组进行存储,但它在其上实现了一些技巧,例如预分配更大矩阵的选项、启用非零开始、使用跨步等。该类没有本机打印接口,我无法修改它,也无法轻松链接到我自己的代码。
自定义功能使得在 Python 中重现直接数据访问代码变得很痛苦。但这有必要吗?一般来说:为什么漂亮的打印应该重现访问数据的逻辑?我不能只使用 C++ 调用并使用 [] 运算符来打印第 i,j 个元素吗?事实上,在此类请求期间,Slice 类是 GDB 中的临时类,这一事实使情况变得更加复杂。
我也是 python 和 GDB 脚本的初学者。我尝试破解示例以用 gdb.execute 调用替换数据访问,但我不知道如何从 to_string 函数访问对象名称,因此我可以使用类似 gdb.execute(??? + '[] +str(i)+']',假,真)。
我想知道最有效的方法是什么。
我不能只使用 C++ 调用并使用 [] 运算符来打印第 i,j 个元素吗?
您可以使用以下命令从漂亮打印机调用下级(正在调试)进程gdb.parse_and_eval
(docs),但这有几个缺点:
- 你需要一个“实时”进程来执行此操作(换句话说,当你调试核心转储时,你漂亮的打印机将无法工作)
- 如果下级以某种方式损坏,调用其中的函数可能会进一步损坏它
- 如果下级是多线程的,并且漂亮的打印机调用可能需要锁的函数(例如
malloc
),那么你很可能会导致漂亮打印机死锁,并且没有任何方法可以从这种死锁中恢复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)