调试需要用到的常用命令:
调试的工具是gdb,编译时加-g(从Release文件转成Debug文件),增加调试信息
转成Debug的代码为: gcc -c main main.c -g(一定要加-g,不然转不成Debug文件)
gdb main
l //显示代码
b + n //在第n行加断点
r(run)//运行
n(next)//单步行
p(printf) buff //打印buff
q(quit)//退出调试
s//进入函数
finsh//跳出函数
info break//查看断点位置
c//从一个断点到另一个断点.
例子(不断的从键盘输入并打印输入的内容,直到输入end结束程序):
#include <stdio.h>
#include <string.h>
int main()
{
while(1)
{
char buff[128] = {0};
printf("input\n");
fgets(buff,128,stdin);
if(strcmp(buff,"end")==0)
{
break;
}
printf("read:%s\n",buff);
}
return 0;
}
本来输入end应该结束,然而此时并没有结束,所以我们开始调试程序,查看哪里出了问题,Ctrl+C终止程序
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a43367a697dc77303e89e31083be6834.png)
必须先转成Debug文件(后面的-g必须加), gdb main 不能写成 gdb main.c 这样是错误的
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/db9b68364716e372ef0c2a6d7e40d00b.png)
l是显示代码
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fb7a4b31c2196c85596350c86dc0f698.png)
在第6行加了一个断点,然后运行程序,输入end后发现并没有终止,然后每次n往下一步执行
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3ec3b606de37aa7250aef23c1a87522b.png)
然后通过输出buff保存的end值发现,保存进去的是end\n,所以需要修改main程序
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/98d33e262e6c29feacab263149ae1754.png)
退出调试(q)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9bbef2abceafe2a44f7c7ec6561fdefa.png)
将strcmp函数修改为strncmp函数(本次只追求调试结果对,不追求代码的完整性,可执行性)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/254c99fefc7e411a1060e807a9afe77e.png)
修改完以后,重新编译main.c文件,然后执行main(./main)文件,结果正常结束程序
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b2f14974405f96a254312dc1e927b05f.png)