2009年09月04日(金) [長年日記]
- 夏休みはもうとった。
- 少し前に衆議院議員選挙があり、民主党が圧勝した。今の総理大臣はまだ麻生さん。
■ [c++][dev] C++の例外発生時のバックトレースを得る
- [C++]例外の発生箇所を gdb で捕捉する (odz buffer)
にgdbを使ってC++の例外発生時にバックとレースを得る例が書かれていて、わりとお手軽で便利だったので自分でもメモ。内容は上のものと同じです。
サンプルプロラム
#include <iostream> #include <stdexcept> void throw_e() { throw std::runtime_error("oreore"); } int main() { try { throw_e(); } catch (std::runtime_error& e) { std::cout << "exception: " << e.what() << std::endl; } }
これを次のようにデバッグ情報付きでコンパイルする。
$ g++ -g -Wall exception.cpp
実行すると次のようになる。
$ ./a.out exception: oreore
gdbを使ってバックトレースを得る
$ gdb a.out GNU gdb 6.8-debian Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i486-linux-gnu"... (gdb) break main Breakpoint 1 at 0x8048c1c: file exception.cpp, line 10. (gdb) run Starting program: /home/kenichi/work/cxx/a.out Breakpoint 1, main () at exception.cpp:10 10 throw_e(); (gdb) catch throw Catchpoint 2 (throw) (gdb) c Continuing. Catchpoint 2 (exception thrown) 0xb7f888e5 in __cxa_throw () from /usr/lib/libstdc++.so.6 (gdb) bt #0 0xb7f888e5 in __cxa_throw () from /usr/lib/libstdc++.so.6 #1 0x08048bd0 in throw_e () at exception.cpp:5 #2 0x08048c21 in main () at exception.cpp:10
おお、得られた。
- 「catch throw」で例外のthrowに対しブレイクポイントを設定できる。
- ただし、catch throwはプログラム開始後でないとエラーになってしまうようなので、先にmainにブレイクポイントを設定してプログラムを開始し、止まった後でcatch throwを実行している。