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) :查看调用堆栈。

相关推荐
新时代牛马2 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
两点王爷4 小时前
解决 Linux 中 version `CXXABI_1.3.8‘ not found 报错
linux·运维·服务器
xx~t4 小时前
嵌入式——51单片机1
linux·c语言·单片机·嵌入式硬件·51单片机
啦啦啦啦啦zzzz4 小时前
利用RAII机制进行日志的采集
linux·服务器·c++·网络编程·c++20
0+1114 小时前
Linux --线程概念与控制
linux·运维·服务器·jvm
nLif4 小时前
基于GTK的简易MFC对话框兼容层 -- MfcToGTK
linux·c++·mfc·gtk
fengyehongWorld5 小时前
Linux 安装frp实现内网穿透
linux·运维·服务器
一_个前端5 小时前
[TailScale]-打通你的局域网服务器到公网电脑
linux
DO_Community6 小时前
Omarchy 将研发基础设施迁移至 DigitalOcean 云平台
linux·人工智能·llm·agent·omarchy