2

大規模なアプリケーションをデバッグしていますが、特定の文字列がに書き込まれる前に中断したいと思いますstd::cerr。これを行う方法はありますか?

この文字列が書かれているコードには多くの場所があります。文字列は必ずしも形式ではありません

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

それは次のような他の形式である可能性があります

std::cerr << write_error_code();

また、書かれていることがたくさんあるstd::cerrので、私はただ中断することはできませんstd::cerr

私も同じ質問がstd::coutありますが、答えがそれに当てはまらない場合は別の質問を投稿します。

4

1 に答える 1

3

これは私がLinuxで作成したС++の例です。この例はgcc4.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.
于 2012-08-16T07:04:32.100 に答える