//示例程序 #include<stdio.h> intadd_range(int low, int high) { int i, sum; for (i = low; i <= high; i++) sum = sum + i; return sum; } intmain(void) { int result[100]; result[0] = add_range(1, 10); result[1] = add_range(1, 100); printf("result[0]=%d\nresult[1]=%d\n", result[0], result[1]); return0; }
生成并进入gdb
1 2
$ g++ -g test.cpp -o main $ gdb main
单步执行
list列出源程序. list 23表示从第23行开始列出源程序。简写为l
回车重复执行上一次的指令
n 表示next下一步
s , step, 进入被调用函数
1 2 3 4 5 6 7 8 9 10
$ start # 开始运行程序 Thread 1 hit Temporary breakpoint 1, main () at test.cpp:12 12 result[0] = add_range(1, 10); $ n # next单步运行到下一步 (gdb) n 13 result[1] = add_range(1, 100); #如果我们要进入子函数add_range查看运行过程呢 -> `s`表示step (gdb) s add_range (low=1, high=100) at test.cpp:5 5 for (i = low; i <= high; i++)
Thread 1 hit Temporary breakpoint 1, main () at test.cpp:12 12 result[0] = add_range(1, 10); (gdb) s add_range (low=1, high=10) at test.cpp:5 5 for (i = low; i <= high; i++) (gdb) i locals # info local 显示当前栈帧中的变量 i = 32760 sum = 501247388 #此处就可以发现程序的问题:没有赋初值 (gdb) n 6 sum = sum + i; (gdb) i locals i = 1 sum = 501247388 (gdb) set var sum = 0 # 修改sum的值 (gdb) n 5 for (i = low; i <= high; i++) (gdb) p sum # print sum $1 = 1 # $1是临时变量,临时显示 (gdb)
Thread 1 hit Temporary breakpoint 1, main () at test.c:10 10int result[5] = {0}; (gdb) n 11 result[0] = Sum(1 , 10) ; (gdb) s Sum(low=1, high=10) at test.c:3 3 int i =0 , sum = 0 ; (gdb) n 4for(i = low ; i <= high ; i++){ (gdb) 5 sum += i ; (gdb) p result No symbol "result" in current context. // 当前栈帧没有"result" (gdb) bt // 显示当前栈帧 backtrace #0Sum (low=1, high=10) at test.c:5 #10x00000000004015c2in main() at test.c:11 (gdb) f 1 // frame 1 , 1为bt列出来的栈帧编号 #10x00000000004015c2 in main () at test.c:11 11 result[0] =Sum(1 , 10) ; (gdb) p result $1 = {0, 0, 0, 0, 0}
断点调试
1 2 3 4 5 6 7 8 9 10 11 12 13
#include<stdio.h> intmain(void) { int sum = 0, i = 0; char input[8] ; while (1) { scanf("%s", input); for (i = 0; input[i] != '\0'; i++) sum = sum*10 + input[i] - '0'; printf("input=%d\n", sum); } return0; }
(gdb) c Continuing. [New Thread 18408.0x4c14] input=1234
Thread 1 hit Breakpoint 2, main () at test.c:7 7 scanf("%s", input); 1: sum = 1234 2: input[i] = 0 '\000' (gdb) n 5678 8 for (i = 0; input[i] != '\0'; i++) 1: sum = 1234 (gdb) n 9 sum = sum*10 + input[i] - '0'; 1: sum = 1234
如此便找到问题所在:下一次循环中,sum会在上一次循环输入的基础上进行累加
只要在每一次输入输出结束后将sum置零即可,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include<stdio.h> intmain(void) { int sum = 0, i = 0; char input[8] ; while (1) { scanf("%s", input); for (i = 0; input[i] != '\0'; i++) sum = sum*10 + input[i] - '0'; printf("input=%d\n", sum); sum = 0 ; } return0; }
i b 查看所有断点信息info breakpoints
delete breakpoints <num> 删除所指的编号断点
disable breakpoints <num>禁用所指编号断点
enable breakpoints <num>
run 从头开始连续而非单步执行程序
b <num> if <command> 设立触发断点的条件,例如b 7 if sum != 0
观察点
依然是之前的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#include<iostream> usingnamespace std ; intmain(){ char input[5] ; int sum ; while(1){ sum = 0 ; scanf("%s" , input) ; for(int i = 0 ; input[i] != '\0' ; i++){ sum = sum * 10 + input[i] - '0' ; } cout << "input = " << sum << endl ; } return0 ; }
如果我们没有注意到数组长度,输入了长度大于4的字符串,input产生了越界会发生什么
1 2 3 4 5 6 7 8 9 10
Thread 1 hit Temporary breakpoint 6, main () at test.cpp:7 7 sum = 0 ; (gdb) n 8 scanf("%s" , input) ; (gdb) 12345 9 for(int i = 0 ; input[i] != '\0' ; i++){ (gdb) c Continuing. input = 123407