前に、
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で、「動いているプログラムをデバッグする」方法
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 |