Linux:基础开发工具(六)

今天我们来讲gdb与cgdb调试器,作为我们基础开发工具终章,这个难度可想而知,不过不要着急,我会带着你一步一步使用它

因为cgdb是gdb的升级版,所以我们主要使用cgdb

我们开始cgdb学习(>.<)

准备事项

1.cgdb安装

使用下面的代码进行cgdb安装

sudo yum install -y cgdb

这里我已经安装过了,所以出现了Nothing to do

2.测试代码编写

code.c复制下面代码即可,Makefile希望大家自己编写巩固Makefile知识

cpp 复制代码
#include <stdio.h>    
    
int Sum(int s, int e)    
{    
    int result = 0;    
    for(int i = s; i <= e; i++)    
    {    
        result += i;    
    }    
    return result;                                                                                                                                                                                               
}    
    
int main()    
{    
    int start = 1;    
    int end = 100;    
    printf("I will begin\n");    
    int n = Sum(start, end);    
    printf("running done, result is: [%d-%d]=%d\n", start, end, n);    
    return 0;    
}

调试选择(release与debug)

• 程序的发布⽅式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的⼆进制程

序,默认是 release 模式。

• 要使⽤gdb调试,必须在源代码⽣成⼆进制程序的时候, 加上 -g 选项,如果没有添加,程序⽆法被编译

默认release模式,且为了支持代码里面for(int 初始化)我们需要使用c99标准(-std=c99)

加上-g生成可调式程序code,发现debug模式下code的内存更大(8520 < 9792)

使用cgdb开始调试

1.开始: gdb binFile

2.退出: ctrl + d 或 quit 调试命令

3.显示源代码:l/list

一般用得不多,因为cgdb已经帮助我们显示出来了

显⽰源代码,从上次位置开始,每次列出10⾏ :l/list 10

list/l 函数名

列出指定函数的源代码 : list/l main

list/l ⽂件名:⾏号

列出指定⽂件的源代码 : list/l mycmd.c:1

4.在指定⾏号设置断点 : break/b ⽂件名:⾏号

断点处行号将变成红色

5.查看当前所有断点的信息 : info break/b
6.从程序开始连续执⾏ : r/run

没有断点直接运行到结束(上述是没加断点的情况),有断点运行到断点(下面是有断点的情况,运行到17),然后开始n/s调试

7.单步执⾏,不进⼊函数内部,类似vs2022逐过程 F10 : n/next
8.单步执⾏,进⼊函数内部, 逐语句 F11 : s/step
9.finish执⾏到当前函数(局部函数,main函数里面用不了)返回,然后停⽌
10.删除所有断点 : delete/d breakpoints
11.删除序号为n的断点 : delete/d breakpoints n
12.禁用所有断点 : disable breakpoints(不是删除)

从y变成n了

13.启⽤所有断点 : enable breakpoints
14.特定断点禁用与启用 : disable breakpoints / enable breakpoints + n
15.打印表达式的值 : print/p 表达式
16.打印指定变量的值 : p 变量

但是有个缺点,就是只是显示一下,我总不能每次调试都要p一下我想查看的值吧,而且加入我想看100个值,那岂不是要一直p100下,而且每次循环都要p 100,于是又下面这个指令了

17.跟踪显⽰指定变量的值(每次停⽌时) : display 变量名
18.取消对指定编号的变量的跟踪显⽰ :undisplay 编号
19.执⾏到指定⾏号 :until X⾏号
20.从当前位置开始连续执⾏程序 : continue/c

没有其他断点的话直接执行断点后面未执行的所有程序

有断点的话依个执行断点

cgdb扩展功能

1.watch

执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者

注意:

• 如果你有⼀些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如

果变化了,就会通知你.

• 监视变量的变化

watch监视的result也算一种断点,所以要想删掉这个断点,可以使用d指令

2.条件断点

注意:

• 条件断点添加常⻅两种⽅式:1. 新增 2. 给已有断点追加

• 注意两者的语法有区别,不要写错了。

• 新增: b ⾏号/⽂件名:⾏号/函数名 if i == 30 (条件)

• 给已有断点追加: condition 2 i==30 , 其中 2 是已有断点编号,没有if

• Cgbd 分屏操作 ESC 进⼊代码屏, i 回到 gdb 屏

好啦,今天的博客就到这里啦,下面我们将学习Linux的第一座大山,进程!

加油各位>.<
相关推荐
Rebecca_aLi几秒前
码匠教育:从手工表格到脚本自动化,Python 改造工作流的思路
运维·python·自动化
开开心心就好2 分钟前
Windows视频播放器推荐,精简版体积更小
java·服务器·开发语言·eclipse·pdf·ocr·音视频
开开心心就好2 分钟前
A3的PDF怎么切成A4?拖一下分割线就行
服务器·开发语言·python·算法·pdf·ocr·tornado
Yan卌3 分钟前
探析全球虫害治理前沿 —— 美国 PestWorld 展会简述
大数据·运维·人工智能
小此方3 分钟前
Linux网络(二十二):深入解析IP协议:从地址寻址、头部结构到内核机制与TTL环路控制
linux·网络·tcp/ip
Ruiery4 分钟前
Linux 6.6内核内存管理深度解析(四):大页(HugeTLB / THP)— 为什么一个页表项要管 2MB
linux·运维·服务器
晚枫歌F7 分钟前
dpdk实现arp协议
服务器·网络
Lsetea7 分钟前
OpenSSL报certificate rejected:error 28与CA辅助信任属性排查
linux·https·ssl证书·openssl·证书链
沫璃染墨10 分钟前
从零入门计算机网络系列(五):UDP套接字编程实战——从核心API到客户端与服务器通信
linux·网络·c++·vscode·网络协议·udp
Margrop1 Margrop12 分钟前
别再挨个试清华、中科大、阿里源了!国家队下场的“CERNET 镜像聚合站”,凭什么让你的下载直接起飞?
linux·开源镜像·cernet