一.代码样例(以下部分内容均已本样例来学习)
求1~100的和
#include<stdio.h>
int Sum(int begin,int end){
int result=0;
for(int i=begin;i<=end;i++){
result+=i;
}
return result;
}
int main(){
printf("we will begin!\n");
int ret=Sum(1,100);
printf("the sum is:%d\n",ret);
return 0;
}
二.认识gdb
gdb即调试器。
为什么需要调试器了?因为程序员在编写程序时,时常会遇到代码错误和各种各样的问题,为了解决问题,就需要找到问题的所在,而寻找问题的这个过程就是调试。
三.学前须知
1.程序的发布⽅式有两种, debug 模式和 release 模式。
2.Linux下我们执行以下命令所编译生成的可执行程序是无法进行调试的!!!(因为不包含调试信息),程序只有在debug模式下才能被调试。
gcc 源文件 -o 生成的可执行程序的名称
以上命令编译生成的可执行文件默认是release(发布)版本(因为gcc/g++默认的工作模式是release模式),所以不能调试。
2.要想调试的话需要在第一点的那个命令结尾上加上一个-g选项,让最后形成的可执行程序得以添加调试信息,从而成为debug模式。
3.执行以下命令便可以查看该可执行程序是否有调试信息:
readelf -S 可执行程序 | grep -i debug
谨记:程序要调试,必须是debug模式!也就是说编译时要加-g选项,同时调试时gdb后面要跟携带调试信息的exe,不能是.c,.cpp,.h等文件。
注意:若使用博主这里第一部分的代码样例的话,需要在编译时(gcc)后面加上一个-std=c99,因为当前是不支持在for循环里定义变量的。
四.release版本的可执行程序与debug版本的可执行程序的区别
1.文件大小的不同
没加-g的release版

加-g的debug版

2.是否包含调试信息
没加-g的release版

加-g的debug版

五.使用gdb的一些不好的方面
我们先见一见吧:

不好的地方:看不到原来的代码区域,只有debug调试区域,后面我们要打断点,查看变量等操作时十分不方便的。
所以我们建议学习cgdb这个调试器,它便具有分区显示的功能(代码和调试分开),其操作和使用gdb是一样的。
六.cgdb的安装
Centos环境:sudo yum install -y cgdb
Ubuntu环境:sudo apt-get install -y cgdb
七.如何使用cgdb进行调试操作
1.使用cgdb对可执行程序进行调试
cgdb 可执行程序
2.常见使用

2.补充说明
(1)删除断点的时候,delete简写为d,后面要跟断点的编号而不是断点所在的行号。看图理解:

其中Num列表示断点编号,Type列表示类型,Enb表示使能列(后面将),Address列表示断点所在行的地址,what列表示断点打在哪里。
(2)断点编号是呈线性递增的,当你删除一个断点后,新打了一个断点时是接上去的(就像是你删除了编号为1,2,3,然后新打了一个断点,而这个断点编号不会是1,而是4),只有退出cgdb,重新进入时才重1开始编号。
(3)若没有打断点儿这直接执行r命令时,程序直接运行到结束,不会停止。只有打了断点后,执行r会在断点处停止。
(4)之前所说的使能列,就是使之能或者使之不能的意思(针对断点),使之能就是启用断点(程序运行到此处会停下,对应列的值为yes),使之不能就是禁用断点(程序运行到此处不会停下,效果跟没有差不多,对应列的值为no)
(5)进入cgdb后按Esc的话会切到代码区域,可以上下滑动,按i的话切到debug区域。建议不要使用鼠标滚轮滑动,不太友好。
最后,由于操作太多,不好演示,若对哪条命令不懂,可在评论区留言,博主会细心帮你解答!!!
2246






