Eclipse+Cygwin環境でデバッグするとき、いつもはGoogleTestを使っている。

GoogleTestを実行してセグメンテーション違反をすると、Windowsは以下のエラーを返す。

 [main] sample 10968 exception::handle: Exception: STATUS_ACCESS_VIOLATION 1714 [main] sample 10968 open_stackdumpfile: Dumping stack trace to sample.exe.stackdump

例:こんなお粗末ソース

#include

int add(int x, int y)
{
int z;
char *p;

z = x + y;
*p = 1; /* ここでセグメンテーション違反 */
return z;
}

こんなとき、Eclipseの画面からGDBを起動して、どこで落ちたかを調べると便利だったので、メモ。

環境

  • Eclipse 4.2 Juno
  • GDB 7.5
  • Cygwin 1.7.17-1

EclipseでGDBを利用するための設定

コンパイルオプション

まずは実行ファイルを作るときにコンパイルオプションで以下を追加。

CPPFLAGS += -g -O0

-g : GDB用のデバッグ情報を実行ファイルに含める。

-Oo : コンパイラに最適化をさせない。

ルックアップパスの設定

デバッグ・パースペクティブにソースが現れないときは、ソースのパスが設定されていない。

Can't find a source file at : hogehoge...

[ウィンドウ] > [設定] > [C/C++] > [デバッグ] > [ソース・ルックアップ・パス] から追加したいソースがあるフォルダを追加する。

GDBを実行してみる

デバッグ・パースペクティブからF11を実行できればOK。

Defaultではmainでbreakするように設定されているので、[再開]F8する。

すると、STATUS_ACCESS_VIOLATIONが発生した場所まで移動して、

ソースを表示してくれる。

image

まとめ

今回、xUnitとGDBを組み合わせることでデバッグがさらに効率的になるのではと思い、記事にしてみた。

この方法の前は、いちいちテストやソースにprintやexitを仕込んでいたが、始めっからgdbを使えばよかったなと、今頃ながら気づいたのだった。

xUnitでテストするようになってから、さすがにもう手動でのテストをする気にはなれないが、こんな組み合わせもいいかもしれない。