2010-09-30 109 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