【C语言】GDB使用

简介: 【C语言】GDB使用

gdb简介

GDB(GNU Debugger)是GCC的调试工具。

要使用GDB,需要在源代码编译的时候添加 -g 参数。

用到四个基础文件 file1.c、file2.c 、head.h、hello.c,一个 makefile 文件

其中文件file1.c 如下:

#include"head.h"

int sum(int a, int b)
{
   
        printf("here is file1\n");
        return a+b;
}

其中文件file2.c 如下:

#include"head.h"

int mul(int a,int b)
{
   
        printf("here is file2\n");
        return a*b;
}

其中文件head.h如下:

#include<stdio.h>
int sum(int a,int b);
int mul(int a,int b);

其中调用文件 hello.c 如下:

#include"head.h"

int main()
{
   
        printf("here is hello.c\n");
        int a=sum(1,2);
        int b=mul(2,2);
        printf("1+2=%d\n",a);
        printf("2*2=%d\n",b);
        return 0;
}

makefile文件:

src=$(wildcard ./*.c)
obj=$(patsubst %.c,%.o,$(src))
target=hello
CC=gcc
CPPFLAGS=-I ./
# 最终目标
$(target):$(obj)
        $(CC) -o $@ $^
#注意这里加了参数 -g
%.o:%.c
        $(CC) -o $@ -g -c $< $(CPPFLAGS)

# 伪目标
.PHONY:clean
clean:
        rm -rf $(target) $(obj)

使用 make 命令生成 hello 可执行文件,注意在编译阶段一定要添加 -g 参数

make
#输出,并生成 hello 可执行文件
gcc -o file2.o -g -c file2.c -I./
gcc -o hello.o -g -c hello.c -I./
gcc -o file1.o -g -c file1.c -I./
gcc -o hello file2.o hello.o file1.o

gdb启动

gdb启动命令

#gdb 可执行文件
gdb hello
#输出
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
...
...
Reading symbols from hello...done.
(gdb)

gdb 就启动了,可以在gdb里面输入以下相关调试命令进行调试

1. 显示源代码

命令 作用
show listsize 查看当前 list 命令显示的行数
set listsize count 设置 list 命令显示的行数为count
list 显示当前源程序文件,显示下方默认行数的内容
list - 这里可以理解成减号,显示上方默认行数的内容
list linenum 显示 linenum 行处的上下文内容
list function 显示函数名为function的函数的源程序
list file:linenum 显示file文件下第n行
list file:function 显示file文件的函数名为function的函数的源程序

show listsize

查看当前 list命令 显示行数的大小

(gdb) show listsize
#输出,默认显示 10行
Number of source lines gdb will list by default is 10.

set listsize count

设置一次显示源代码的行数

#设置默认显示 5行
(gdb) set listsize 5
#输出默认显示行数
(gdb) show listsize
#输出,默认显示5行
Number of source lines gdb will list by default is 5.

2. 设置断点

设置断点用 break 命令, 简写为 b

2.1 添加断点

命令 作用
b linenum 在第 linenum 行设置断点
b func 在函数 func 入口处设置断点
b filename:linenum 在源文件filename的linenum行处设置断点
b filename:function 在源文件filename的function函数的入口处设置断点
b test.c:8 if value== 5 条件断点,当变量value的值为5时断电生效

2.2 查看所有断点

命令 作用
info break 简写 i b ,查询所有断点

2.3 断点属性修改

删除断点

命令 作用
delete num 简写 d num ,删除某个断点
delete num1 num2 简写 d num1 num2,删除多个断点
delete n1-n2 简写 d n1-n2 ,删除多个断点
delete 删除所有断点

禁用断点

命令 作用
disable num 简写 dis num ,禁用某个断点
disable num1 num2 简写 dis num1 num2,禁用多个断点
disable n1-n2 简写 dis n1-n2 ,禁用多个断点
disable 禁用所有断点

启用断点

命令 作用
enable num 简写 ena num ,启用某个断点
enable num1 num2 简写 ena num1 num2,启用多个断点
enable n1-n2 简写 ena n1-n2 ,启用多个断点
enable 启用所有断点

3. 调试代码

命令 作用
run 简写 r ,运行程序,有断点也不停
start 运行程序,有断点停止运行
next 简写 n,单步执行
step 简写 s,单步执行,可以进入函数体内
finish 退出函数体
until 简写为u,在循环体内单步执行, 直到退出循环体
continue 简写为c,继续运行程序, 若有断点则跳到下一个断点处

4. 查看变量的值

命令 作用
print count 简写p count,打印变量count
display 变量名 添加一个变量名展示
info display 查看添加了哪些变量名展示
undisplay num(info display时显示的编号) 删除某个变量展示
delete display num 删除某个变量展示
disable display num 禁用某个变量的展示
enable display num 启用某个变量的展示

5. 其他语法

查看变量类型: ptype 变量名

临时设置变量的值:set var 变量名=值

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
NoSQL Unix C语言
【嵌入式开发】C语言 命令行参数 函数指针 gdb调试(一)
【嵌入式开发】C语言 命令行参数 函数指针 gdb调试(一)
190 0
【嵌入式开发】C语言 命令行参数 函数指针 gdb调试(一)
|
NoSQL Linux C语言
【嵌入式开发】C语言 命令行参数 函数指针 gdb调试(二)
【嵌入式开发】C语言 命令行参数 函数指针 gdb调试(二)
121 0
|
NoSQL Linux 测试技术
基于c语言中调试工具的用法汇总(不包含gdb)【转】
转自:http://www.jb51.net/article/36829.htm 是不是只有编译的时候才知道程序写了错误?有没有在未编译的时候就让机器帮你检查错误的工具呢? 答案是:有!! splint工具.
1022 0
|
NoSQL Linux C语言
用gdb来学习c语言(linux环境下)
本文转自:http://blog.csdn.net/physicsdandan/article/details/8076446 gdb的使用介绍 先创建一个如下的C程序,minimal.c int main() {     int i = 1337;     return0; } 这个程序不做任何事情并且没有一个printf语句。
1027 0
|
10天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
25 3
|
1天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
17 10
|
5天前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
|
11天前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
27 2