忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

グッバイ・セグメンテーションエラー ~ Linuxでのデバッグ

こんにちは柴崎です。

Linuxの授業で作ったプログラムがエラーで落ちる時に役立つデバッグ法を紹介します。


拍手[0回]


プログラムをデバッグするにはGDBを使用します。こいつを通してプログラムを実行すると、エラーが発生したソースファイル・行番号等を表示してくれます。
(他にもブ レークポイントを設定したり、変数の中身を見る等いろんなことができますが、今回は説明を省きます)

まず授業で使っているmakefileで作るプログラムには、デバッグに必要な情報が付加されていないので、makefileの次の箇所を変更します。

変更前 変更後
$(CC) $(LINKER) -o $@ $(OBJS) $(CC) $(LINKER) -g -o $@ $(OBJS)

-g はコンパイル時にデバッグ情報を付加するオプションです。makefileを変更したらプログラムを再コンパイルします。これでデバッガーを使ってプログラムを実行する準備ができました。


GDBで「main.out」というプログラムをデバッグするには、コンソールで次の様にします。
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

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]