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.