こんにちは柴崎です。
Linuxの授業で作ったプログラムがエラーで落ちる時に役立つデバッグ法を紹介します。
[0回]
プログラムをデバッグするには
GDBを使用します。こいつを通してプログラムを実行すると、エラーが発生したソースファイル・行番号等を表示してくれます。
(他にもブ レークポイントを設定したり、変数の中身を見る等いろんなことができますが、今回は説明を省きます)
まず授業で使っているmakefileで作るプログラムには、デバッグに必要な情報が付加されていないので、makefileの次の箇所を変更します。
変更前 |
変更後 |
$(CC) $(LINKER) -o $@ $(OBJS) |
$(CC) $(LINKER) -g -o $@ $(OBJS) |
-g はコンパイル時にデバッグ情報を付加するオプションです。makefileを変更したらプログラムを再コンパイルします。これでデバッガーを使ってプログラムを実行する準備ができました。
GDBで「main.out」というプログラムをデバッグするには、コンソールで次の様にします。
これでGDBを起動するとズラーっとメッセージが表示されて次の様に入力待ちになるはずです。ここからはコマンドを打ち込んでGDBを操作していくことになります。
gdb main.out
~中略~
(gdb) _ |
今回使用するコマンド
run |
プログラムを実行します。rで代用可能。 |
continue |
停止したプログラムを再開します。cで代用可能。 |
quit |
GDBを終了します。qで代用可能。 |
プログラムを開始するには「run」コマンドを使用します。コマンドを入力してエンターを押すと次の様に表示され、プログラムが実行されます。
(gdb) run
Starting program: /foo/bar/main.out |
プログラム実行中にセグメンテーションエラーが発生すると、次の様に表示され入力待ちになります。
(gdb) run
Starting program: /foo/bar/main.out
Program received signal SIGSEGV, Segmentation fault.
0x00000000 in hoge() at main.cpp:9
~エラーが発生した行のソースコード~ |
赤字で強調表示している所が重要な部分です。上の例では「main.cpp」の9行目、関数「hoge」の中でエラーが発生しています。
プログラムをエラーが発生した場所から先へ進ませるには「continue」コマンドを使用します。このコマンドは一時停止しているプログラムを再開させます。
プログラムが終了すると、「Program exited normally」や「Program terminated with signal...」等のメッセージが表示され、プログラム実行前の状態に戻ります。
「quit」コマンドでGDBを終了して終わりです。
こんな感じでGDBを使用すると、どこでエラーが発生したかを調べることができます。GDBは今回紹介した以外にも様々な機能がついているので、興味のある人は是非調べてみてください。
PR
COMMENT