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

加油各位>.<
相关推荐
不想画图1 分钟前
Ansible自动化运维工具及基础用法
运维·自动化·ansible
SELSL4 分钟前
标准IO总结
linux·c语言·标准io·stdio·标准io与文件io的区别
爱尔兰极光7 分钟前
计算机网络--IPv4地址
服务器·网络·计算机网络
大猫和小黄8 分钟前
Ubuntu环境下GitBlit安装部署与版本库迁移
linux·运维·git·ubuntu·gitblit
sdyeswlw10 分钟前
一二三物联网医院后勤综合运维管理系统:让后勤保障更智能、更省心
运维·物联网
点亮一颗LED(从入门到放弃)19 分钟前
设备树驱动(6)
linux
加勒比之杰克22 分钟前
【操作系统原理】软硬链接与动静态库
linux·os·动静态库·软硬链接
管理大亨26 分钟前
光伏大棚智慧管理:ELK数据中枢
大数据·运维·elk·elasticsearch
KingRumn26 分钟前
Linux进程间通信之消息队列(POSIX)实现篇
linux·服务器
未来之窗软件服务26 分钟前
幽冥大陆(五十四)ASR C语言识别到自动化软件——东方仙盟筑基期
运维·自动化·仙盟创梦ide·东方仙盟·东方仙盟自动化·东方仙盟商业开发