如何在Linux下使用gdb/cgdb调试代码

个人主页

一.代码样例(以下部分内容均已本样例来学习)

求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区域。建议不要使用鼠标滚轮滑动,不太友好。
最后,由于操作太多,不好演示,若对哪条命令不懂,可在评论区留言,博主会细心帮你解答!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值