Linux复习之gdb断点调试实例

断点就是指在程序的某一行设置一个点位,程序在这个指定的位置中断。在gdb调试下,设置断点的指令为break,通常有以下集中方式:

break :在进入指定函数时停住
break :在指定行号停住
break +/-offset:在当前行号的前面或者后面的offset行停住offset为自然数
break filename:linenum:在源文件filename的linenum行处停住
break…if…:可以使上述的参数,condition表示条件,在条件成立时停住
delete:删除所有断点
delete breakpoint[n]:删除某个断点
disable breakpoint[n]:禁用某个断点
enable breakpoint[n]:**某个断点

下面是一个断点调试实例,源程序的功能是求1到n的和并输出:
Linux复习之gdb断点调试实例
程序运行结果如下:
Linux复习之gdb断点调试实例
程序的功能是求1~n之和并输出,从图中可以看到,运行第一次输入2时,结果为3,是正确的,但是第二次输入3时,结果应该是6,但程序运行结果为9,之后的结果也都是错误的,这时候我们就需要利用gdb调试工具设置断点进行调试。
步骤如下:
1.编译源程序
gcc -o gdbbp gdbbp.c -g
2.将可执行文件载入gdb,进入gdb调试界面
gdb gdbbp
Linux复习之gdb断点调试实例
程序的关键部分在与for循环实现累加,所以我们的断点也应该设置在这里。我们通过list命令获得for语句所在的行号。
Linux复习之gdb断点调试实例
可以看到for语句位于程序的第九行,通过指令:break 9,在第九行设置断点。
Linux复习之gdb断点调试实例
通过start命令开始执行程序,然后通过指令c连续运行程序。
Linux复习之gdb断点调试实例
可以看见,第一次输入2时,data=2,sum = 0,i为随机数(未赋值)。继续运行:
Linux复习之gdb断点调试实例
当输入3时,这时data = 3,sum = 3,i = 3,可以看出来,sum的值并没有清0,还是上一次累加的结果,所以应该在每次循环前,将sum置为0.
知道了错误在哪里,我们就可以回到源代码对程序进行修改了,修改之后的程序如下:
Linux复习之gdb断点调试实例
Linux复习之gdb断点调试实例
测试后发现程序运行结果正确。