release 和debug版本
Debug 版本为可调式版本,生成的可执行文件中包含调试需要的信息。我们作为开发人员,最常用的就是 debug 版本的可执行文件。
Release 版本为发行版本,是提供给用户使用的版本。用 gcc 默认生成的就是 Release 版本。
Debug版本的生成
因为调试信息是在编译过程时加入到中间文件(.o)中的,所以必须在编译时控制其生成包含调试信息的中间文件。
即增加调试信息 -g
示例
gcc -o main main.c -g
或者
gcc -c main.c -g
gcc -o main main.o
gdb常用命令
- l —— 显示main函数所在文件的源代码
- b+行号—— 给指定行添加断点
- b+函数名 —— 给指定函数的第一有效行加断点
- info break —— 显示断点信息
- r(run) —— 启动该程序
- n(next) —— 单步执行
- c(continue) —— 继续执行,直接到下一个断点处
- finish —— 跳出函数
- p + val —— 打印val的值
- p + &val —— 打印val地址
- p + 数组名 —— 打印数组所有元素的值
- q —— 退出调试
程序示例
测试程序为:
release版本
正常编译链接步骤为:
gcc -o test test.c
这时候发现程序并没有按照我的要求跳出循环(我是要求如果输入end就退出)
debug版本
所以为了找出问题所在,我决定将其 编译为debug版本
步骤:
- gcc -o test test.c -g
- gdb test
一定不要忘了加上 -g
调试过程
接下来先试试常用命令
l——显示源代码
q——退出
命令都能正常用,那就加断点调试。这里给字符数组这一行和输出的那一行加断点。
这里单步执行,并用p查看,发现buff里的数据是 end\n ,和 end 不相等,所以不能退出。
修改方法:
错误是末尾有换行符,那再输入后把换行符去掉就好,如图:
fgets的下一句就是把末尾的换行符换成’\0’ , 即字符串的结束标志。
这时候如果输入end, 就可以正常退出了