在windows操作系统下,我们的运行程序有两个版本。
- debug开发调试版本
得到的可执行文件.exe文件相对较大,其中包含调试信息。且不做任何优化,未开发人员提供强大的应用调试能力
- Release发行版本
文件相对较小,不包含调试信息,并进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。
在linux操作系统下,我们通过gcc来完成代码的编译链接,命令:gcc -o main main.c 其生成的可执行文件与release版本下生成的可执行文件相像,均不包含调试信息,若想其包含调试信息,需要在其命令后加入命令-g,即gcc -o main main.c -g,此时生成的文件即可进行调试。Linux下调试需要借助调试工具gdb。
Gdb调试总结
Gdb调试的对象:进程
1、进入调试
命令gcc -o main mian.c -g,产生包含调试信息的可执行文件main,
命令gdb main进入调试模式
注意:输入命令结束并按回车键后若显示最后一个单词为done在进入调试模式,否则,可能第一次命令未输入-g导致未产生包含调试信息的可执行文件。
2、显示代码以进行加断点操作
命令 l
若代码显示不全则继续输入命令l/回车键,回车键为继续执行上一次输入的命令
- 断点操作
加断点 命令b 行号(l后显示的行号)
显示断点信息 命令info break
删除断点 delete 断点编号(info break 后显示的编号)
- 启动调试/运行程序
命令 r
- 调试过程
单步执行 命令 n
进入函数 命令 s
退出函数 命令 finish
打印 命令 p 变量
继续执行 命令 c (遇到断点就会停止,如果想要越过断点,需要delete删除断点)
显示当前位置/函数调用栈信息(关系) 命令 bt
退出调试 命令 q
注意:若想退出死循环进程。按Ctrl+c
调试实例
在Linux下创建普通文件main.c,内容为:
#include<stdio.h>
#include<stdlib.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);
}
printf("main over\n");
exit(0);
}
调试后,可以很明显的发现其原因是在liunx环境下,在字符转结尾会自动补\n标记,这不同于window下的\0标记,所以键盘输入的“end”和代码中比较的“end”无法匹配,需要将strcmp中进行匹配的“end”改为“end\n”。