首页 > 解决方案 > 通过 gdb 将 c++ 变量传递给 python

问题描述

我正在开发/调试一个广泛使用 c++ STL 向量和 blitz cpp 数组的 c++ 代码(向量/数组是多维的,最多 4D/5D 数组)我目前正在使用 cout/print 来记录函数的输入/输出的输出,但它变得非常乏味。为了能够在调试时打印向量/数组,您能否提出任何选项。我想到了几个选择

(a) 在 c++ 上编写模板函数来打印和使用 GDB 的“调用”功能。但无法将 GDB 的“调用”功能用于 c++ 模板函数,但适用于普通函数。(b) 是否可以将 c++ 变量传递给 GDB 的 python 接口并打印它们?有什么相同的例子吗?

我在发布这个问题之前用谷歌搜索,但没有找到任何有用的线程。非常感谢任何帮助(即使可以提供一些链接)

非常感谢提前!

标签: stlgdbgdb-pythonblitz++

解决方案


用 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 是一个更常见的选择。


推荐阅读