15
3月
2007

continueとステップ実行

breakした後処理を続けるにはcontinueで継続実行するか,step実行する.
継続実行
ステップ実行

継続実行

まず,この項で使用するサンプルを示す.

 2: #include <stdlib.h>

  4: int hoge(int i);

  6: int main(void)
  7: {
  8:   hoge(1);hoge(2);
  9:   hoge(
 10:        5);

 12:   exit(EXIT_SUCCESS);
 13: }

 15: int hoge(int i)
 16: {
 17:   int result = 1;
 18:   for(;i > 0; i--){
 19:     result *= i;
 20:   }
 21:   fprintf(stdout,"result = %d\n",result);
 22:   return result;
 23: }

このサンプルでは8〜10行目にあえて変な書き方をしてみた.早速gdbにかけてみる.

$ gdb a.out 
(gdb) break 17
Breakpoint 1 at 0x804849a: file continue-step.c, line 17.
(gdb) run
Starting program: /home/hoge/programing/c/learn-gdb/continue-step/a.out 

Breakpoint 1, hoge (i=1) at continue-step.c:17
17        fprintf(stdout,"i = %d\n",i);
(gdb) continue 
Continuing.
i = 1

Breakpoint 1, hoge (i=2) at continue-step.c:17
17        fprintf(stdout,"i = %d\n",i);
(gdb) 
Continuing.
i = 2

Breakpoint 1, hoge (i=3) at continue-step.c:17
17        fprintf(stdout,"i = %d\n",i);
(gdb) 
Continuing.
i = 3

Program exited normally.
上ではbreakポイントを17行目に設定して,runしている.breakポイントで止まったあとcontinueすると,再びbreakポイントで止まっている.continueでは以下の状態までプログラムを続行する.
プログラムが終了する.
シグナルを受け取る.
breakポイントに到達する.

ステップ実行

例えば1行ずつ実行していきたい場合など,ちょっとずつ実行したい場合はステップ実行を行なう.主なステップ実行のためのコマンドを示す.「ステップ」の幅はコマンドによって異なる.
step
ソースの異なる行に到達するまで実行する.
next
その時のスタックフレーム内でソースの次の行まで実行する.
finish
その時のスタックフレームがreturnするまで実行する.
until
その時の次の行に到達するまで実行する.
それぞれステップ幅が終る前に異なるbreakポイントに到達したりすると,やはり実行は止まる.また,step,nextに引数として数字を入力すると,その回数だけステップ実行する.以下にこれらの使用例を示す.まず8行目にbreakポイントを設定してrunする.
$ gdb a.out 
(gdb) break 8
Breakpoint 1 at 0x8048456: file continue-step.c, line 8.
(gdb) run
Starting program: /home/hoge/programing/c/learn-gdb/continue-step/a.out 

Breakpoint 1, main () at continue-step.c:8
8         hoge(1);hoge(2);
ここでnext(略してn)を入力すると,8行目が終了するまで,すなわちhoge(1)とhoge(2)の両方を実行する.その時の「スタックフレーム内」だから,関数hogeの中では止まらない.
(gdb) n
result = 1
result = 2
9         hoge(
今度はstep(略してs)を実行すると,関数hogeの中の最初で停止する.とにかくソースの異なる行だから関数hogeの中で止まるのである.
(gdb) s
hoge (i=5) at continue-step.c:17
17        int result = 1;
今度はforループの最後の行までstepして(最後に実行したのがstepだから単にリターンを押すとstepが実行される)untilしてみる.するとforループが終るまで実行する.
(gdb) 
18        for(;i > 0; i--){
(gdb) 
19          result *= i;
(gdb) until
18        for(;i > 0; i--){
(gdb) 
21        fprintf(stdout,"result = %d\n",result);
関数hogeの中でfinishを実行すると関数hogeが返るまで実行する.
(gdb) finish
Run till exit from #0  hoge (i=0) at continue-step.c:21
result = 120
0x0804847a in main () at continue-step.c:9
9         hoge(
Value returned is $1 = 120
そしてcontinueで最後まで実行する.
(gdb) c
Continuing.

Program exited normally.

You may also like...