用 C++ 编写代码来打印数组并从 gdb 调用它当然是一种选择,但它可能不可靠,因为您编写的打印函数可能无法访问(链接器可能已将其删除,因为它未在您的 c++ 代码中使用,例如)。另外,请记住,模板只是“食谱”,您实际上需要使用它们才能让编译器从中生成类/函数。
是否可以将 c++ 变量传递给 GDB 的 python 接口并打印它们?有什么相同的例子吗?
一个简单的答案是“是”。使用 gdb 的 python API 时可以使用模块中的parse_and_eval
函数。gdb
诸如此类的东西
py print(gdb.parse_and_eval('your_variable'))
your_variable
将打印使用 gdb 的 python API调用的变量的值。但这与p your_variable
不使用 python API 的 gdb 常规提示相同。当您使用 gdb 的 python API 为您想要调试的类型编写漂亮的打印机时,真正的力量就来了。
漂亮的打印机基本上只是您或其他人编写的一些代码,用于告诉 gdb 如何以一种不错的方式打印某种类型。在 gdb 提示符中使用漂亮打印机以p your_variable
漂亮打印机定义的方式打印变量。
通过快速谷歌搜索,我找不到用于 blitz 的漂亮打印机,而且我以前没有使用过 blitz。但是,我在科学计算中使用了另一个用于向量和矩阵的库,称为犰狳,因此遇到了类似的问题。因此,我在这里为犰狳写了一些漂亮的打印机,如果你决定为闪电战写漂亮的打印机,它们可能会对你有所帮助。
作为说明,您可以在下面看到arma::mat
犰狳的(双精度矩阵)类型是如何在没有漂亮打印机的情况下在 gdb 中打印的(m1
变量,它是一个 6x3 双精度矩阵)
请注意,我们甚至看不到矩阵元素。它们存储在对象mem
属性指向的连续内存区域中arma::mat
。
现在与此处提供的漂亮打印机相同的矩阵。
这使得调试代码更容易。
注意:你也可以用 guile 语言编写漂亮的打印机,但我敢打赌 python 是一个更常见的选择。