Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何制作C++;类gdb友好?_C++_Gdb - Fatal编程技术网

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漂亮打印机。像这样的简单例子可以在我的宏中实现。确保生成时启用了调试符号。