使用GDB打印C ++类对象

时间:2013-03-01 17:18:12

标签: c++ debugging gdb

是否有一些"默认功能"在调试C ++应用程序时,在GDB上打印像字符串这样的对象?类似于:toString();

或者我的班级必须实施类似的东西?

4 个答案:

答案 0 :(得分:3)

您可以使用std::string命令始终打印print(或其他任何内容)。但是,与C ++模板容器内部的挣扎可能并不令人愉快。在最新版本的工具链(GDB + Python + Pretty Printers,它们通常作为大多数用户友好的Linux发行版的开发包的一部分一起安装)中,这些工具链会被自动识别和打印(非常好!)。例如:

$ cat test.cpp 
#include <string>
#include <iostream>

int main()
{
    std::string s = "Hello, World!";
    std::cout << s << std::endl;
}

$ g++ -Wall -ggdb -o test ./test.cpp 
$ gdb ./test 

(gdb) break main
Breakpoint 1 at 0x400ae5: file ./test.cpp, line 6.
(gdb) run
Starting program: /tmp/test 

Breakpoint 1, main () at ./test.cpp:6
6       std::string s = "Hello, World!";
Missing separate debuginfos, use: debuginfo-install glibc-2.16-28.fc18.x86_64 libgcc-4.7.2-8.fc18.x86_64 libstdc++-4.7.2-8.fc18.x86_64
(gdb) next
7       std::cout << s << std::endl;
(gdb) p s
$1 = "Hello, World!"
(gdb) 

正如@ 111111指出的那样,请查看http://sourceware.org/gdb/wiki/STLSupport,了解如何自行安装。

答案 1 :(得分:2)

您可以在调试会话期间从标准库中call any member functions或您自己的数据类型。这有时是在gdb中输出对象状态的最简单方法。对于std::string,您可以将其称为c_str()成员,该成员返回const char*

(gdb) p str.c_str()
$1 = "Hello, World!"

虽然这只适用于调试实时进程,但不适用于核心转储调试。

答案 2 :(得分:1)

gdb有一个内置的print命令,你可以在gdb中调用任何变量或表达式来查看它的值。您应该查看gdb文档以获取详细信息。您可以找到完整的手册here,并找到一份体面的介绍指南here

答案 3 :(得分:0)

定义operator<<并从GDB调用

注释中提到了

C++ equivalent of Java's toString?operator<<是在类上定义to字符串方法的最常用方法。

这可能是最明智的方法,因为生成的字符串方法将是代码库本身的一部分,等等:

  • 停止编译的可能性较小(有人希望!)
  • 无需任何GDB设置即可轻松使用
  • 可以在需要时从C ++本身调用它

不幸的是,我还没有找到一种从GDB调用operator<<的完全理智的方法,真是一团糟:calling operator<< in gdb

这已在我的世界测试中起作用:

(gdb) call (void)operator<<(std::cerr, my_class)
MyClass: i = 0(gdb)

最后没有换行符,但是我可以接受。

main.cpp

#include <iostream>

struct MyClass {
    int i;
    MyClass() { i = 0; }
};

std::ostream& operator<<(std::ostream &oss, const MyClass &my_class) {
    return oss << "MyClass: i = " << my_class.i;
}

int main() {
    MyClass my_class;
    std::cout << my_class << std::endl;
}

编译:

g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp

在GDB 8.1.0,Ubuntu 18.04中进行了测试。