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的第一座大山,进程!

加油各位>.<
相关推荐
百***48071 小时前
Linux下MySQL的简单使用
linux·mysql·adb
不会写代码的ys2 小时前
仿RabbitMQ实现消息队列(三)--muduo介绍与使用
linux·分布式·rabbitmq
不吃鱼的羊2 小时前
Autosar ECUM
linux·运维·服务器
llilian_162 小时前
晶振有什么好用的检测仪器?石英晶振测试仪 晶体测试仪
服务器·单片机·嵌入式硬件·其他
这周也會开心2 小时前
docker整理
运维·docker·容器
DARLING Zero two♡2 小时前
多人实时共用浏览器?Neko+cpolar 让异地协作像坐在一起办公
服务器
xcLeigh3 小时前
不用买服务器!用 Portainer+cpolar 搭个公网能访问的网站超简单
运维·服务器·cpolar·portainer
xc丶卡卡3 小时前
麒麟ARM64安装达梦数据库
linux·运维·服务器·arm·达梦
shepherd枸杞泡茶3 小时前
.NET客户端自动更新的设计与实现
linux·.net