gdb入门实例2——断点调试实例

测试代码

#include 

int main (int argc, char *argv[]) {
    int sum = 0, i = 0;
	char input[5];

	while (1) {
		scanf("%s", input);
		for (i = 0; input[i] != '\0'; ++i) 
			sum = sum * 10 + input[i] - '0';
		printf("input = %d\n", sum);
    }
    return 0;
}

测试过程

程序的作用是首先从键盘读入一串数字保存到char数组中,然后通过input[i] - '0’转换为整型存到sum中
例如输入“123”,会得到整数123

1)编译运行

可以看到,第一次的时候结果还是对的,为什么第二次发生了错误呢?
gdb入门实例2——断点调试实例_第1张图片

我们也已经为sum给了初始值0了呀,为什么会出现这样的错误呢?
可以使用display命令使得每次停下来的时候都显示当前sum的值
gdb入门实例2——断点调试实例_第2张图片
如果不想跟踪显示了,可以使用undisplay命令,变量sum的编号是1,可以使用undisplay 1命令来取消它的跟踪显示
可以看到,sum已经赋了初始值,并不是sum的问题

2)断点调试

首先我们在运算处设置一个断点,
gdb入门实例2——断点调试实例_第3张图片
然后使用continue命令让程序连续运行而非单步运行,可以看到,已经到断点处停止,然后使用命令next完成赋值
gdb入门实例2——断点调试实例_第4张图片
继续运行程序,发现123是能正确得到的,当我们输入456时,发现此时sum的值已经是123了,而不是从0开始
gdb入门实例2——断点调试实例_第5张图片
那么,这个时候,我们就发现了问题所在,原来是在下一次循环的时候,sum的值没有从0开始
于是我们用set命令来设置当前变量的值为0,继续运行程序
gdb入门实例2——断点调试实例_第6张图片
这个时候,你发现,sum的值是4了,是不是好像对了呢?继续执行
gdb入门实例2——断点调试实例_第7张图片
好的,程序运行成功了,说明要每次循环的开始都要将sum置为0才可以

Tips:查看、禁用、启用、删除断点

查看断点:info breakpoints
禁用断点:disable breakpoints
启用断点:enable 编号
删除断点:delete breakpoints

你可能感兴趣的:(gdb练习)