メモの日々


2009年09月04日(金) [長年日記]

  • 夏休みはもうとった。
  • 少し前に衆議院議員選挙があり、民主党が圧勝した。今の総理大臣はまだ麻生さん。

[c++][dev] C++の例外発生時のバックトレースを得る

に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を実行している。