continueとステップ実行
breakした後処理を続けるにはcontinueで継続実行するか,step実行する.
まず,この項で使用するサンプルを示す.
このサンプルでは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
- その時の次の行に到達するまで実行する.
$ 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.

