ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

GDBで、単純にデバッグする方法

2018-09-26 09:04:32 | Weblog
前に、

GDBで、「動いているプログラムをデバッグする」方法
https://blog.goo.ne.jp/xmldtp/e/2b8bd9f0a146f6ac430bcb9b71f812b0

って書いたけど、そもそも、単純に(動的にではなく、gdbから起動する形で)デバッグする方法は
書いてなかったので、一応書いておく。

■お題
 上記のエントリと同じ。以下のプログラム(test.c)をデバッグする。

 このプログラムを、デバッグしたいので、gcc -gオプションでコンパイルした
gcc -o test -g test.c
 ところから、話を始める。

 上記エントリとちがうのは、
   このプログラムを動いている状態でGDBを起動してデバッグするのではなく、
   GDBを起動し、その中で、このプログラムを動かすところ。



■方法
結果を貼ってしまうと、こんなかんじ

・gdb テストしたいプログラム で立ち上げる。
 例:gdb test
 今回は、捜査結果をファイルに書き出したいので(このエントリの最後にその書き出した結果、つけといた)
 tee 書き出したいファイル名 をつけている。つまり
 gdb test | tee wkf.txt

・b 行番号 で行番号にブレークポイントが貼られる

・r で読み込んだプログラムが実行する。
 ただし、今回は、引数1を与えている。
 r 引数1 引数2 ・・・
 という形で、起動時の引数は渡せる。今回の場合は
  例: r 1
 ってこと。

・あとの c でブレークポイントにいく
  nで次に進む
  p 変数 で変数の値が見れる
  s 変数 で変数に値がセットできる
はおなじ。

以下、teeしたwkf.txtのなかみ、つまり操作内容を下に貼っておく

(gdb) b 15
Breakpoint 1 at 0x40062c: file test.c, line 15.
(gdb) r 1
Starting program: /home/user/test 1

Breakpoint 1, main (argc=2, argv=0x7fffffffde28) at test.c:15
15			if ( c == -1 )
(gdb) p c
$1 = 97
(gdb) n
20			if ( argv[1][0]	==	'1' )
(gdb) c
Continuing.

Breakpoint 1, main (argc=2, argv=0x7fffffffde28) at test.c:15
15			if ( c == -1 )
(gdb) s c=-1
main (argc=2, argv=0x7fffffffde28) at test.c:15
15			if ( c == -1 )
(gdb) 
[K(gdb) 
[K(gdb) n
17				break;
(gdb) n
30		printf("\n ***********  end  ***********\n");
(gdb) n
31		return 0;
(gdb) n
33	}
(gdb) quit
A debugging session is active.

	Inferior 1 [process 2331] will be killed.

Quit anyway? (y or n) y


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする