如何解决如何使C ++类对gdb友好?
请考虑以下示例:
std::string s = "Hello!!";
(gdb) p s
$1 = "Hello!!";
本质上,仅提供变量名就足以显示字符串。例如,我不必键入“ p s.c_str()”。
gdb是否使用任何隐式运算符来获取显示字符串?我上课需要做类似的事情。这是我班上一个简单的例子:
class MyClass {
private:
std::string _name;
};
解决方法
您需要为您的课堂写一个漂亮的打印机。这不是在C ++类中执行的操作,而是在gdb中执行的操作(尽管与C ++类匹配)。最简单的方法是通过gdb的Python API(您也可以使用Guile语言)。
GDB已经为大多数标准库类提供了漂亮的打印机,这就是为什么您可以轻松看到std::string
对象,std::vector
等的原因。如果键入info pretty-printer
在gdb中,它将告诉您当前已知的漂亮打印机,并且您会注意到许多std::something
漂亮打印机。
如果对gdb中的print命令使用传递/r
,它将在不使用任何与之匹配的已注册漂亮打印机的情况下打印变量。尝试使用std::string
进行尝试,以查看gdb没有附带漂亮打印机的情况下如何打印。
那么,如何编写自己的漂亮打印机?为此,您应该阅读GDB's documentation上的该主题。但是我发现,通过阅读和调整一些现有的漂亮打印机开始,要容易得多,然后再阅读gdb的文档以了解详细信息。
例如,如下所示,我在一个项目中有一个Coordinate
类
class Coordinate {
private:
double x;
double y;
double z;
public:
...
}
为此类编写漂亮的打印机非常容易。使用以下代码创建python文件
class CoordinatePrinter:
def __init__(self,val):
# val is the python representation of you C++ variable.
# It is a "gdb.Value" object and you can query the member
# atributes of the C++ object as below. Since the result is
# another "gdb.Value" I'am converting it to a python float
self.x = float(val['x'])
self.y = float(val['y'])
self.z = float(val['z'])
# Whatever the `to_string` method returns is what will be printed in
# gdb when this pretty-printer is used
def to_string(self):
return "Coordinate(x={:.2G},y={:.2G},z={:.2G})".format(self.x,self.y,self.z)
import gdb.printing
# Create a "collection" of pretty-printers
# Note that the argument passed to "RegexpCollectionPrettyPrinter" is the name of the pretty-printer and you can choose your own
pp = gdb.printing.RegexpCollectionPrettyPrinter('cppsim')
# Register a pretty-printer for the Coordinate class. The second argument is a
# regular expression and my Coordinate class is in a namespace called `cppsim`
pp.add_printer('Coordinate','^cppsim::Coordinate$',CoordinatePrinter)
# Register our collection into GDB
gdb.printing.register_pretty_printer(gdb.current_objfile(),pp,replace=True)
现在我们需要做的就是在gdb中source
这个python文件。为此,请写入您的.gdbinit文件
source full_path_to_your_python_file_with_pretty_printers.py
启动gdb时,它将运行您的.gdbinit
文件,该文件将加载漂亮的打印机。请注意,这些漂亮的打印机通常也可以在使用gdb的IDE中使用。
如果您对更多示例感兴趣,我已经为Armadillo库中的here库中的某些类(矢量,矩阵和一般线性代数)创建了漂亮的打印机。
,如果已安装libstdc++ pretty-printers(已经安装了它们),则您的类已经是gdb友好的了,因为在打印类的成员时将调用它们。如果您除了_name
之外还有很多其他班级成员,也可以使用set print pretty
来更容易地区分它们:
(gdb) p my_class
$1 = {_name = ""}
(gdb) set print pretty
(gdb) p my_class
$2 = {
_name = ""
}
(gdb)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。