[通过gdb将c ++变量传递给python

问题描述 投票:0回答:1

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

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

我在发布此问题之前用Google搜索,但没有找到任何有用的主题。非常感谢您的帮助(即使可以提供一些链接)

非常感谢!

stl gdb gdb-python blitz++
1个回答
0
投票

在C ++中编写代码以打印数组并从gdb调用它当然是一个选项,但是它可能不可靠,因为您编写的打印函数可能无法访问(链接器可能已将其删除,因为在c ++中未使用它代码)。另外,请记住,模板只是“配方”,实际上,您需要使用它们,以便编译器从中生成类/函数。

是否可以将C ++变量传递到GDB的python接口并打印它们?相同的任何示例吗?

对此的一个简单答案是“是”。使用gdb的python API时,可以在parse_and_eval模块中使用gdb函数。诸如

之类的东西
py print(gdb.parse_and_eval('your_variable'))

将使用gdb的python API打印名为your_variable的变量的值。但这与不使用python API的gdb常规提示中的p your_variable相同。使用gdb的python API为要调试的类型编写pretty-printers时,才有真正的力量。

漂亮打印机基本上只是您或其他人编写的一些代码,用于告诉gdb如何以一种不错的方式打印某种类型。对于gdb提示符中的p your_variable类型的漂亮打印机,将以漂亮打印机定义的漂亮方式打印变量。

我无法通过快速的Google搜索找到用于闪电战的漂亮打印机,而且我之前从未使用过闪电战。但是,我在科学计算中使用了另一个用于向量和矩阵的库,称为armadillo,因此面临类似的问题。因此,我为犰狳here写了一些漂亮的打印机,以防万一您决定为闪电战写漂亮的打印机。

作为说明,在下面您可以看到在没有漂亮打印机的情况下,如何在gdb中打印犰狳的arma::mat(双精度矩阵)类型(m1变量,它是6x3的双精度矩阵)

armadillo matrix without pretty printer

注意我们甚至看不到矩阵元素。它们存储在由mem对象的arma::mat属性指向的连续存储区域中。

现在与漂亮打印机here使用相同的矩阵。

armadillo matrix with pretty printer

这使调试代码容易得多。


注意:您也可以使用guile语言编写漂亮的打印机,但是我敢打赌python是更常见的选择。

© www.soinside.com 2019 - 2024. All rights reserved.