2012-08-14 59 views
1

我正在調試一個大型應用程序,並且在將某個字符串寫入std::cerr之前我想中斷。我有辦法做到這一點?將某個字符串寫入std之前的gdb中斷:cerr

代碼中有很多地方寫這個字符串。 字符串並不總是形式

std::cerr << "some error code"; 

它可能是其他形式,如

std::cerr << write_error_code(); 

另外請注意,有很多事情被寫入std::cerr,所以我不能只是打破的std::cerr

我也有同樣的問題,但std::cout但我會張貼另一個問題,如果答案不適用於此。

回答

2

這是我在Linux上做的一個++例子。這個例子已經用gcc 4.3編譯。

#include <iostream> 
#include <stdio.h> 
#include <setjmp.h> 

void write_error_code() 
{ 
    std::cerr << "some error code"; 
} 

int main() 
{ 
    std::cout << "Start, main()\n"; 
    std::cerr << "some error code" << std::endl; 
    std::cerr << "some error code?" << std::endl; 
    std::cerr << "some error code?" << std::endl; 
    write_error_code(); 
    std::cout << "End, main()\n"; 

    return 0; 
} 

我看了看拆機一看,發現std::cerr << ""與符號名稱_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc的功能。
該函數有2個參數:__out__s
所以我創建了一個.gdbinit文件:

host: srv2-x64rh5-02, OS: Linux 2.6.18-238.el5>more .gdbinit 
file a.out 
b _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc 
commands 
silent 
if strcmp(__s, "some error code") == 0 
    print "Some error code has been given as an arg" 
    bt 
    c 
else 
    c 
end 
end 
r 
quit 

在這裏測試我的程序:

host: srv2-x64rh5-02, OS: Linux 2.6.18-238.el5>gdb -q ./a.out 
Reading symbols from /import/home/sergey.kurenkov/src/linux.x64.5.0/tests/test.br_on_std_cerr/a.out...done. 
Breakpoint 1 at 0x400710 
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x2aaaaaaab000 
Start, main() 
$1 = "Some error code has been given as an arg" 
#0 std::operator<< <std::char_traits<char> > (__out=..., __s=0x400a4c "some error code") 
    at /home/zalex/test/gcc_build/x86_64-unknown-linux-gnu/libstdc++-v3/include/ostream:509 
#1 0x0000000000400873 in main() at main.cpp:13 
some error code 
some error code? 
some error code? 
$2 = "Some error code has been given as an arg" 
#0 std::operator<< <std::char_traits<char> > (__out=..., __s=0x400a4c "some error code") 
    at /home/zalex/test/gcc_build/x86_64-unknown-linux-gnu/libstdc++-v3/include/ostream:509 
#1 0x000000000040084f in write_error_code() at main.cpp:7 
#2 0x00000000004008f5 in main() at main.cpp:18 
some error codeEnd, main() 

Program exited normally. 
+0

爽,謝謝!這需要我花一些時間來消化,所以我稍後可能會爲你提供一些問題。我非常感謝你投入這一切! – 2012-08-16 20:22:12