Linux调试器-gdb的使用

一、背景

程序的发布方式有两种,debug模式 和release模式。

Linux中gcc/g++出来的二进制程序,默认是release模式。

要使用gdb调试,必须在gcc/g++编译的时候加上**-g**选项。例如:gcc编译test.c文件生成test可执行程序。

cpp 复制代码
gcc -o test test.c -g

二、gdb的基础用法和相关选项

对于可执行文件test而言。

2.1 进入调试模式指令

gdb test

cpp 复制代码
[xxl@VM-0-2-centos test]$ gdb test
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/xxl/test/test...done.
(gdb)     //调试输入指令位置

2.2 退出调试模式指令

(gdb) quit

或者Ctrl+D

cpp 复制代码
(gdb) quit
[xxl@VM-0-2-centos test]$ 

gdb会记住最近的一条指令,在不输入指令时会自动执行最近的一条指令。

2.3 显示原代码指令

(gdb) l 数字n或函数名
(gdb) list / l 行号 :显示第n行以及n行上下几行的一段代码。

(gdb) list / l 函数名 :从函数所在位置的10行代码。

cpp 复制代码
(gdb) l main
2	int Add(int x,int y)
3	{
4	    return x+y;
5	}
6	int main()
7	{
8	    int a=10;
9	    int b=20;
10	    printf("%d\n",Add(a,b));
11	    return 0;

2.4 断点相关指令

(gdb) break(b) 行号 :在某一行设置断点。

(gdb) break(b) 函数名 :在某个函数开头位置设置断点。

(gdb) break(b) 文件名:行号(函数名):在某个文件的某行或某个函数开头位置设置断点。

(gdb) info break(b) :查看断点信息。

cpp 复制代码
(gdb) b 5
Breakpoint 1 at 0x40053f: file test.c, line 5.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040053f in Add at test.c:5

Num代表断点的编号。

Type表示是一个断点。

Enb代表断点是否开启。

Address代表断点的地址。

What代表断点的位置。

删除断点需要根据断点的编号才能正确的删除断点。

(gdb) delete(d) 断点编号 :根据断点编号删除断点。

(gdb) continue(c) :从一个断点跳到下一个断点。

(gdb) disable 断点编号 :根据断点编号关闭相应的断点。

(gdb) enable 断点编号 :根据断点编号开启相应的断点。

2.5 调试相关指令

(gdb) r:开始调试。

(gdb) next(n) :逐过程进行调试(不进入函数内部,类似VS中的F10)。

(gdb) step(s) :逐语句进行调试(进入函数内部,类似VS中的F11)。

(gdb) until 行数n :直接跳到第n行。

(gdb) finish:直接运行完当前的函数。

2.6 变量相关指令

(gdb) p 变量名 :查看变量。

(gdb) p 变量地址 :查看变量地址。

(gdb) display 变量 :一直显示变量。

(gdb) undisplay 变量编号 :关闭对应编号变量的显示。

(gdb) info locals :查看main函数的本地变量。

cpp 复制代码
(gdb) display a    //一直显示变量a
1: a = 0        
(gdb) undisplay 1    //关闭变量a的显示
    

2.7 其他指令

(gdb) breaktrace(bt) :查看调用堆栈。

相关推荐
Ruiery14 小时前
Linux 6.6内核 CPU 深度解析(七):调度器启动 — 从单核到多核,调度器分阶段点亮
linux·运维·服务器
50万马克的面包14 小时前
CSDN-栈队列数组-知识点整理
linux·运维·服务器
wjkjpcba15 小时前
PCBA烧录程序是什么:PCBA包工包料厂家解析烧录与测试
linux·数据库·人工智能·smt贴片加工·pcba贴片加工厂
꯭自꯭闭꯭15 小时前
达梦事物特性及MVCC
linux·运维·数据库
羔羊++17 小时前
18_实验十七_其他命令与自定义启动变量
linux
DYWorker00119 小时前
Linux驱动:RK3568 GMAC + YT8531C 千兆以太网全流程解剖
linux
lisanmengmeng21 小时前
NRPE 添加命令(一)
linux·运维·服务器
树下水月21 小时前
Typora破解
linux·服务器·前端
沫璃染墨1 天前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理
wuminyu1 天前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++