2010-09-30 110 views
10

你如何从gdb内部拨打operator<<(std::ostream &os, const ClassX &x)主叫运营商<< in gdb

换句话说,你如何在gdb中打印对象?

call std::cout<<xcall operator<<(std::cout, x)似乎不适合我!

任何想法?

+0

我输入命令'print'打印变量和对象。 – 2010-09-30 17:29:54

+4

我正在使用一个类,在这个类中operator <<做了很多信息是可读的,所以使用print和原始数据有点麻烦。 – Ben 2010-09-30 17:53:30

回答

10

我发现的唯一办法是这样的:

call 'operator<<(std::ostream&, myclass&)'(mycout, c) 

由于std::cout并不是GDB出于某种原因可见,我不得不求助于创造我自己是这样的:

std::ostream mycout(std::cout.rdbuf()); 

你没有说明有任何理由要这样做,但不会print yourvariable更容易?

如果这是绝对必须的,您可以在您的课堂上使用Print方法,并从operator<<调用该方法,然后从gdb调用对象的Print方法。

请注意,标准输出可能被缓冲在gdb中,所以除非您以某种方式重定向,否则您将不会看到任何输出。

请参阅this来自gdb的邮件存档关于此问题的讨论。

3

您还可以定义像函数:

define printType 
call operator<<(std::ostream&, const $arg0 &)(std::cerr, $arg1) 
end 

而且使用它像:

平面广告类型ClassX objectOfClassX

0

对我来说call operator<<运行,没有错误,但没有打印。原来我需要致电flush。这里有一个有用的功能,你可以在.gdbinit中输入:

define str 
    call (void)operator<<(std::cout, $arg0) 
    call (void)std::cout.flush() 
    printf "\n" 
end