C++ 如何制作C++;类gdb友好?
考虑以下示例:C++ 如何制作C++;类gdb友好?,c++,gdb,C++,Gdb,考虑以下示例: std::string s = "Hello!!"; (gdb) p s $1 = "Hello!!"; 本质上,只提供变量名就足以显示字符串。例如,我不必键入“ps.c_str() gdb是否使用任何隐式运算符来获取显示字符串?我需要为我的班级做一些类似的事情。下面是我的班级的一个小例子: class MyClass { private: std::string _name; }; 你需要为你的班级写一个漂亮的打印机。它不是你
std::string s = "Hello!!";
(gdb) p s
$1 = "Hello!!";
本质上,只提供变量名就足以显示字符串。例如,我不必键入“ps.c_str()
gdb是否使用任何隐式运算符来获取显示字符串?我需要为我的班级做一些类似的事情。下面是我的班级的一个小例子:
class MyClass {
private:
std::string _name;
};
你需要为你的班级写一个漂亮的打印机。它不是你在C++类中所做的事情,而是在GDB中所做的事情(虽然与C++类匹配)。最简单的方法是通过gdb的pythonapi(您也可以使用Guile语言) GDB已经为大多数标准库类提供了漂亮的打印机,这就是为什么您可以很容易地看到
std::string
对象,一个std::vector
,等等。如果您在gdb中键入info pretty printer
,它将告诉您当前了解的pretty printers,您将注意到许多std::something
pretty printers
如果您在gdb中使用pass/r
到print命令,它将打印变量,而不使用任何可能与之匹配的注册打印机。用std::string
试试看,如果gdb没有漂亮的打印机,它将如何打印
那么,你怎样才能写出自己漂亮的打印机呢?为此,你应该阅读这个主题。但是我发现从阅读和调整一些你可以找到的现有漂亮的打印机开始,然后阅读gdb的文档来了解细节要容易得多 例如,我的一个项目中有一个
坐标类,如下所示
class Coordinate {
private:
double x;
double y;
double z;
public:
...
}
为这门课写一个漂亮的打印机很容易。使用以下代码创建python文件
类协调器接口:
定义初始值(self,val):
Y.Var是你C++变量的Python表示。
#它是一个“gdb.Value”对象,您可以查询该成员
下面是C++对象的ActubTs。因为结果是
#我正在将另一个“gdb.Value”转换为python浮点值
self.x=float(val['x'])
self.y=float(val['y'])
self.z=float(val['z'])
#无论'to_string'方法返回什么,都将打印出来
#当使用这台漂亮的打印机时
def到_字符串(自):
返回“坐标(x={.2G},y={.2G},z={.2G})”.format(self.x,self.y,self.z)
导入gdb打印
#创建漂亮打印机的“集合”
#请注意,传递给“RegexpCollectionPrettyPrinter”的参数是漂亮打印机的名称,您可以自己选择
pp=gdb.printing.RegexpCollectionPrettyPrinter('cppsim')
#为坐标类注册漂亮的打印机。第二个论点是
#正则表达式和我的坐标类位于名为“cppsim”的命名空间中`
pp.add_打印机('Coordinate','^cppsim::Coordinate$',CoordinatePrinter)
#将我们的收藏注册到GDB
gdb.printing.register\u pretty\u printer(gdb.current\u objfile(),pp,replace=True)
现在我们需要做的就是在gdb中源代码这个python文件。为此,请写入.gdbinit文件
使用pretty\u printers.py从源代码完整路径到python文件
当你启动gdb时,它将运行你的.gdbinit
文件,这将加载你漂亮的打印机。请注意,这些漂亮的打印机通常也可以在使用gdb的IDE中工作
如果您对更多示例感兴趣,我已经为库中可用的一些类(向量、矩阵和一般线性代数)创建了漂亮的打印机。如果您已经安装了(您已经安装了它们),那么您的类已经是gdb友好的,因为它们将在打印类的成员时被调用。如果除了\u name
之外还有很多其他类成员,您还可以使用set print pretty
更容易区分它们:
(gdb) p my_class
$1 = {_name = ""}
(gdb) set print pretty
(gdb) p my_class
$2 = {
_name = ""
}
(gdb)
您需要使用gdb的脚本工具为您自己的类型添加漂亮的打印机。请参阅:这是gdb的特性之一,实际上有漂亮的打印机
用于显示标准类,并可用于表示自定义类。对于std::string
,gdb的旧版本无法做到这一点。要创建定制的漂亮打印机,可以在gdb命令行中使用define命令或编写python漂亮打印机。像这样的简单例子可以在我的宏中实现。确保生成时启用了调试符号。