0

0

linux下gdb调试方法与技巧整理「建议收藏」

雪夜

雪夜

发布时间:2025-07-17 10:24:38

|

616人浏览过

|

来源于php中文网

原创

大家好,很高兴再次与大家见面,我是你们的老朋友全栈君。

目录 一、gdb简介 二、gdb使用流程 1、启动gdb 2、查看源码 3、运行程序 4、设置断点 5、单步执行 6、查看变量 7、退出gdb 三、gdb基本使用命令 1、运行命令 2、设置断点 3、查看源码 4、打印表达式 5、查看运行信息 6、分割窗口 7、cgdb强大工具 8、常用gdb调试命令汇总 四、总结

一、gdb简介 GDB是由GNU开源组织发布的、适用于UNIX/LINUX操作系统的、基于命令行的强大程序调试工具。对于在Linux环境下工作的C/C++程序员来说,gdb是必不可少的工具。

二、gdb使用流程 这里以C程序为例进行基本演示,C++程序的使用方法类似。

1、启动gdb 编译一个测试程序,使用-g选项以便可以调试,命令如下:

gcc -g test.c -o test

启动gdb,命令如下:

gdb test
gdb -q test // 表示不打印gdb版本信息,界面较为简洁;

测试如下:

root@ubuntu:/home/eit/c_test# gdb test
GNU gdb (Ubuntu 7.7-0ubuntu3) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb) q
root@ubuntu:/home/eit/c_test# gdb -q test
Reading symbols from test...done.
(gdb) 

至此,gdb已成功启动!

2、查看源码 使用list(简写为l)命令查看源程序代码,默认显示10行,按回车键继续查看余下的内容。测试如下:

(gdb) list
9#define MAX_SIZE
10
11int main()
12{
13    int i,fd,size1 ,size2 ,len;
14    char *buf = "helo!I'm liujiangyong ";
15    char buf_r[15];
16    len = strlen(buf);
17    fd = open("/home/hello.txt",O_CREAT | O_TRUNC | O_RDWR,0666);
18    if (fd

3、运行程序 使用run(简写为r)命令运行程序,直到程序结束或遇到断点等待下一个命令。测试如下:

(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/eit/c_test/test 
open file:hello.txt 3
写入的长度:22
写入文本内容:helo!I'm liujiangyong 
读取长度:12 
文本内容是:helo!I'm liu
[Inferior 1 (process 19987) exited normally]
(gdb) 

4、设置断点 使用break(简写为b)命令设置断点,格式为b 行号,在某行设置断点。使用info breakpoints命令显示断点信息,Num表示断点编号,Disp表示断点执行一次后是否有效,keep表示有效,dis表示无效,Enb表示当前断点是否有效,y表示有效,n表示无效,Address表示内存地址,What表示位置。

(gdb) b 5
Breakpoint 3 at 0x400836: file write.c, line 5.
(gdb) b 26 
Breakpoint 4 at 0x4008a6: file write.c, line 26.
(gdb) b 30
Breakpoint 5 at 0x4008c6: file write.c, line 30.
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
3       breakpoint     keep y   0x0000000000400836 in main at write.c:5
4       breakpoint     keep y   0x00000000004008a6 in main at write.c:26
5       breakpoint     keep y   0x00000000004008c6 in main at write.c:30
(gdb) 

5、单步执行 使用continue、step、next命令进行单步执行。测试如下:

(gdb) r
Starting program: /home/eit/c_test/test 
Breakpoint 3, main () at write.c:12
12{
(gdb) n
14    char *buf = "helo!I'm liujiangyong ";
(gdb) 
16    len = strlen(buf);
(gdb) 
17    fd = open("/home/hello.txt",O_CREAT | O_TRUNC | O_RDWR,0666);
(gdb) s
open64 () at ../sysdeps/unix/syscall-template.S:81
81../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) 
main () at write.c:18
18    if (fd

6、查看变量 使用print、whatis命令查看变量。测试如下:

main () at write.c:28
28    if (fd

7、退出gdb 使用quit命令退出gdb:

(gdb) r
Starting program: /home/eit/c_test/test 
open file:hello.txt 3
写入的长度:22
写入文本内容:helo!I'm liujiangyong 
读取长度:12 
文本内容是:helo!I'm liu
[Inferior 1 (process 20815) exited normally]
(gdb) q
root@ubuntu:/home/eit/c_test# 

continue(简写为c):继续执行程序,直到下一个断点或程序结束; next(简写为n):单步执行程序,但遇到函数时会直接跳过函数,不进入函数; step(简写为s):单步执行程序,但遇到函数会进入函数; until:当你在循环体内单步跟踪时,可以运行程序直到退出循环体; until+行号:运行至某行,不仅仅用来跳出循环; finish:运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息; call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55); quit:简记为q,退出gdb;

三、gdb基本使用命令 1、运行命令 run:简记为r,其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。 continue(简写为c):继续执行,到下一个断点处(或运行结束)。 next:(简写为n),单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同step的主要区别是,step遇到用户自定义的函数,将步进到函数中去运行,而next则直接调用函数,不会进入到函数体内。 step(简写为s):单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的。 until:当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。 until+行号:运行至某行,不仅仅用来跳出循环。 finish:运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。 call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55)。 quit:简记为q,退出gdb。

2、设置断点 break n(简写为b n):在第n行处设置断点(可以带上代码路径和代码名称:b OAGUPDATE.cpp:578)。 b fn1 if a>b:条件断点设置。 break func(break缩写为b):在函数func()的入口处设置断点,如:break cb_button。 delete 断点号n:删除第n个断点。 disable 断点号n:暂停第n个断点。 enable 断点号n:开启第n个断点。 clear 行号n:清除第n行的断点。 info b(info breakpoints):显示当前程序的断点设置情况。 delete breakpoints:清除所有断点。

3、查看源码 list:简记为l,其作用就是列出程序的源代码,默认每次显示10行。 list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12。 list 函数名:将显示“函数名”所在函数的源代码,如:list main。 list:不带参数,将接着上一次list命令的,输出下边的内容。

4、打印表达式 print 表达式:简记为p,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。 print a:将显示整数a的值。 print ++a:将把a中的值加1,并显示出来。 print name:将显示字符串name的值。 print gdb_test(22):将以整数22作为参数调用gdb_test()函数。 print gdb_test(a):将以变量a作为参数调用gdb_test()函数。 display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如:display a。 watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如:watch a。 whatis:查询变量或函数。 info function:查询函数。 扩展info locals:显示当前堆栈页的所有变量。

5、查看运行信息 where/bt:当前运行的堆栈列表; bt backtrace显示当前调用堆栈。 up/down改变堆栈显示的深度。 set args 参数:指定运行时的参数。 show args:查看设置好的参数。 info program:来查看程序的是否在运行,进程号,被暂停的原因。

6、分割窗口 layout:用于分割窗口,可以一边查看代码,一边测试: layout src:显示源代码窗口。 layout asm:显示反汇编窗口。 layout regs:显示源代码/反汇编和CPU寄存器窗口。 layout split:显示源代码和反汇编窗口。 Ctrl + L:刷新窗口。

7、cgdb强大工具 cgdb的主要功能是在调试时进行代码的同步显示,这无疑增加了调试的方便性,提高了调试效率。界面类似vi,符合Unix/Linux下开发人员习惯;如果熟悉gdb和vi,几乎可以立即使用cgdb。

8、常用gdb调试命令汇总

Kubit.ai
Kubit.ai

一个AI驱动的产品分析平台,为产品和数据团队构建

下载

linux下gdb调试方法与技巧整理「建议收藏」

四、总结 总的来说,在Linux下开发程序时,gdb/cgdb是必须学会使用的工具,其强大之处远不止于此。在程序的调试中使用它会提高我们的调试效率,当然gdb的功能与使用技巧还不止于此,多多探索,多多学习使用。

参考链接:https://www.php.cn/link/940222ade2401c27cf112992065c8877

发布者:全栈程序员栈长,转载请注明出处:https://www.php.cn/link/934ae3fe682fd9b04e9a8b15dd789911 原文链接:https://www.php.cn/link/c8377ad2a50fb65de28b11cfc628d75c

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

387

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

611

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

351

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

256

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

597

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

523

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

639

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

599

2023.09.22

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

63

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.2万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号