如何使 C++ 类对 gdb 友好?

Pet*_*ter 6 c++ gdb

考虑以下示例:

std::string s = "Hello!!";

(gdb) p s
$1 = "Hello!!";
Run Code Online (Sandbox Code Playgroud)

本质上,只需提供变量名称就足以显示字符串。例如,我不必输入“p s.c_str()”。

gdb 是否使用任何隐式运算符来获取显示字符串?我需要为我的班级做类似的事情。这是我的班级的一个简单例子:

class MyClass {

private:
  std::string _name;
};
Run Code Online (Sandbox Code Playgroud)

dar*_*amo 5

您需要为您的班级编写一个漂亮的打印机。这不是您在 C++ 类中执行的操作,而是您在 gdb 中执行的操作(尽管与您的 C++ 类匹配)。最简单的方法是通过 gdb 的 Python API(您也可以使用 Guile 语言)。

GDB 已经为大多数标准库类提供了漂亮的打印机,这就是为什么你可以轻松地看到一个std::string对象、一个std::vector等。如果你输入info pretty-printergdb,它会告诉你它当前知道的漂亮打印机,你会注意到许多std::something漂亮的打印机。

如果您/r在 gdb 中使用 pass 到 print 命令,它将打印该变量,而不使用任何可能的与其匹配的已注册漂亮打印机。尝试使用 anstd::string来看看如果 gdb 没有提供漂亮的打印机,它将如何打印。


那么,如何编写自己的漂亮打印机呢?为此,您应该阅读有关此主题的GDB 文档。但我发现从阅读和调整一些现有的漂亮打印机开始,然后阅读 gdb 的文档以获取详细信息要容易得多。

例如,Coordinate我的一个项目中有一个课程,如下所示

class Coordinate {
private:
    double x;
    double y;
    double z;

public:
    ...
}
Run Code Online (Sandbox Code Playgroud)

为这个类编写一个漂亮的打印机非常容易。您使用以下代码创建一个 python 文件

class Coordinate {
private:
    double x;
    double y;
    double z;

public:
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在我们需要做的就是将source这个 python 文件放入 gdb 中。为此,请写入您的 .gdbinit 文件

source full_path_to_your_python_file_with_pretty_printers.py

当您启动 gdb 时,它将运行您的.gdbinit文件,该文件将加载您的漂亮打印机。请注意,这些漂亮的打印机通常也可以在使用 gdb 的 IDE 中工作。

如果您对更多示例感兴趣,我已经为犰狳库中的某些类(向量、矩阵和一般线性代数)创建了漂亮的打印机,可以在此处获取。