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

相关推荐
2601_949847751 小时前
bcrypt.js 跨端三方库仓颉适配全流程
linux·运维·ubuntu
m0_639906941 小时前
Linux 操作系统入门:目录结构、服务排查常用命令、Shell 脚本基础
linux·运维·后端
水饺编程3 小时前
第2章:Linux 基础,exit 命令
linux·c语言·汇编
木子欢儿3 小时前
Debian 13 + vsftpd 搭建FTP服务
linux·服务器·前端·网络·debian
GeW4 小时前
新质生产力落地实践:企业级Linux迁移与数据库国产化
linux
雯宝4 小时前
usb_serial_generic_register
linux
疯狂的Meng5 小时前
我把第一周的 Linux 命令整理成了自己的手册(附 7 个我踩的坑)
linux
wt95275 小时前
VMware 虚拟机静态 IP 配置
linux
小羊没烦恼!5 小时前
分布式事务 | 使用DTM 的Saga 模式
java·linux·运维·数据库·wpf
靳某某。6 小时前
Ubuntu安装php8.4 及redis ngin
linux·redis·ubuntu