GDB调试程序
创始人
2025-05-29 16:09:48

1.GDB 调试程序

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。在UNIX平台下做软件,GDB这个调试工具有比VC的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。

一般来说,GDB主要帮忙你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。

从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。

2.调试示例

2.1 示例代码 test.c

#include
int func (int n) {int sum = 0;int i;for (i = 0; i < n; ++i) {sum += i;}return sum;
}
int main() {int i;long result;for (i = 1; i <= 100; ++i) {result += i;}printf("result[1-100] = %d /n", result);printf("result[1-200] = %d /n",func(200));return 0;
}

2.2 编译生成执行文件

qz@ubuntu:~/network/gdb$ gcc -g test.c -o test

2.3 使用GDB进行调试

qz@ubuntu:~/network/gdb$ gdb test  <---------- 启动GDB
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 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:
.
---Type  to continue, or q  to quit---
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb) 

l命令

(gdb) l  <-------------------- l命令相当于list,从第一行开始例出原码。
1       #include
2       int func (int n) {
3           int sum = 0;
4           int i;
5           for (i = 0; i < n; ++i) {
6               sum += i;
7           }
8           return sum;
9       }
10      int main() {
(gdb) 
11          int i;
12          long result;
13          for (i = 1; i <= 100; ++i) {
14              result += i;
15          }
16          printf("result[1-100] = %d /n", result);
17          printf("result[1-200] = %d /n",func(200));
18          return 0;
19      }(gdb) 
Line number 20 out of range; test.c has 19 lines.
(gdb) 

break 设置断点

(gdb) break 11    <-------------------- 设置断点,在源程序第16行处。
Breakpoint 1 at 0x680: file test.c, line 11.(gdb) break func  <-------------------- 设置断点,在函数func()入口处。
Breakpoint 2 at 0x651: file test.c, line 3.(gdb) info break  <-------------------- 查看断点信息。
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000000680 in main at test.c:11
2       breakpoint     keep y   0x0000000000000651 in func at test.c:3

运行程序,r命令

(gdb) r
Starting program: /home/qz/network/gdb/test Breakpoint 1, main () at test.c:13
13          for (i = 1; i <= 100; ++i) {
(gdb) n       <--------------------- 单条语句执行,next命令简写。
14              result += i;
(gdb) n
13          for (i = 1; i <= 100; ++i) {
(gdb) n
14              result += i;
(gdb) n
13          for (i = 1; i <= 100; ++i) {
(gdb) n
14              result += i;
(gdb) n
13          for (i = 1; i <= 100; ++i) {
(gdb) n
14              result += i;
(gdb) n
13          for (i = 1; i <= 100; ++i) {
(gdb) c      
Continuing.  <--------------------- 继续运行程序,continue命令简写。Breakpoint 2, func (n=200) at test.c:3
3           int sum = 0;
(gdb) n
5           for (i = 0; i < n; ++i) {
(gdb) p i    
$1 = 0
(gdb) n
6               sum += i;
(gdb) p i
$2 = 0
(gdb) n
5           for (i = 0; i < n; ++i) {
(gdb) p i       <--------------------- 打印变量i的值,print命令简写。
$3 = 0
(gdb) n 
6               sum += i;
(gdb) p i
$4 = 1
(gdb) n
5           for (i = 0; i < n; ++i) {
(gdb) n
6               sum += i;
(gdb) p i
$5 = 2
(gdb) p sum
$6 = 1
(gdb) 

bt finish

(gdb) bt    <--------------------- 查看函数堆栈。
#0  func (n=200) at test.c:6
#1  0x00005555555546be in main () at test.c:17
(gdb) finish  <--------------------- 退出函数。
Run till exit from #0  func (n=200) at test.c:6
0x00005555555546be in main () at test.c:17
17          printf("result[1-200] = %d /n",func(200));
Value returned is $7 = 19900
(gdb) c  <--------------------- 继续运行。
Continuing. 
result[1-100] = 5050 /n
result[1-200] = 19900 /n
[Inferior 1 (process 58205) exited  normally]  <----------程序输出。
(gdb) q   <--------------------- 退出gdb。

3 使用GDB

一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。

使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:

gcc -g hello.c -o hello
g++ -g hello.cpp -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。

当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。

启动GDB的方法有以下几种:

  • 1、gdb
    program也就是你的执行文件,一般在当然目录下。
  • 2、gdb core
    用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
  • 3、db
    如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

4 GDB启动开关

GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:

-symbols 
-s 
从指定文件中读取符号表。-se file
从指定文件中读取符号表信息,并把他用在可执行文件中。-core 
-c 
调试时core dump的core文件。-directory 
-d 
加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。

相关内容

热门资讯

安利,拥有这5款甘特图工具,项... 甘特图(Gantt chart)又称为横道图、条状图(Bar chart...
mac搭建go语言环境并编译运... 大家好,这里是 一口八宝周 👏欢迎来到我的博客 ❤️一起交流学习文章中...
车身架号后6位怎么看,车身架号... 今天给各位分享车身架号后6位怎么看,车身架号后6位是什么的知识,其中也会对车架号后六位在哪查进行解释...
早点吃什么(早点吃什么简单又好... 本篇文章极速百科给大家谈谈早点吃什么,以及早点吃什么简单又好吃对应的知识点,希望对各位有所帮助,不要...
加特林是什么梗的简单介绍 加特... 本篇文章极速百科给大家谈谈加特林是什么梗,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。...
黑子说车:劳斯莱斯幻影怎么样?... 本篇文章极速百科给大家谈谈黑子说车:劳斯莱斯幻影怎么样?,以及劳斯莱斯的幻影车型简介对应的知识点,希...
【Java】对象的构造和初始化 对象的构造和初始化如何初始化对象构造方法概念特性默认初始化就地初始化 如何初始化对象 在Java方法...
两份数据安全重磅研究报告|美创... 近日,安全牛正式发布《数据安全管控平台应用指南》、《数据安全管理认证建设指引》研究报告...
C语言预处理条件语句的 与或运... C语言预处理条件语句的 与或运算 1.#ifdef 与或运算 #ifdef  (MIN)  && (...
世界上最贵的车是哪一辆?价值多... 本篇文章极速百科给大家谈谈世界上最贵的车是哪一辆?价值多少钱?,以及世界上最贵的车你知道吗对应的知识...
桂花怎么保存不变色还有香气(桂... 今天给各位分享桂花怎么保存不变色还有香气的知识,其中也会对桂花怎样保存才能保存最久进行解释,如果能碰...
新西兰在哪个洲(新西兰在哪个洲... 本篇文章极速百科给大家谈谈新西兰在哪个洲,以及新西兰在哪个洲的西南部对应的知识点,希望对各位有所帮助...
sio2是什么(sio2是什么... 本篇文章极速百科给大家谈谈sio2是什么,以及sio2是什么意思对应的知识点,希望对各位有所帮助,不...
tcp和udp有什么区别 UDPUDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包...
前端低代码平台、编辑类项目实现... 前端用于低代码平台以及编辑器类项目的开发场景逐渐增多,对于这类项目除去复制粘贴功能以外...
SQL语句性能分析 1. 数据库服务器的优化步骤 当我们遇到数据库调优问题的时候,该如何思考呢࿱...
android8 rk3399... 文章目录一、前文二、CameraHal_Module.h三、CameraHal_Module.cpp...
日产帕拉骐的缺点有哪些?(帕拉... 今天给各位分享日产帕拉骐的缺点有哪些?的知识,其中也会对帕拉骐单排进行解释,如果能碰巧解决你现在面临...
ODM什么意思(ODM什么意思... 今天给各位分享ODM什么意思的知识,其中也会对ODM什么意思百度进行解释,如果能碰巧解决你现在面临的...
普宁市属于哪个市(广东省普宁市... 本篇文章极速百科给大家谈谈普宁市属于哪个市,以及广东省普宁市属于哪个市对应的知识点,希望对各位有所帮...
赛羽(SCOYCO)摩托车骑行... 本篇文章极速百科给大家谈谈赛羽(SCOYCO)摩托车骑行鞋怎么样?确实好差的?,以及赛羽骑行服和mo...
不是,到底有多少种图片懒加载方... 一、也是我最开始了解到的 js方法,利用滚动事件,判断当时的图片位置是否...
ES6解构的常用方式 ES6解构是一个强大的工具,可以帮助我们编写更简洁,以及可读性更高的代码...
8立方吸污车真空吸污车淤泥泥浆... 本篇文章极速百科给大家谈谈8立方吸污车真空吸污车淤泥泥浆抽吸车,以及吸污车10方对应的知识点,希望对...
sci论文是什么(sci论文是... 本篇文章极速百科给大家谈谈sci论文是什么,以及sci论文是什么级别 意思对应的知识点,希望对各位有...
2024年6月泰国(曼谷)国际... 本篇文章极速百科给大家谈谈2024年6月泰国(曼谷)国际改装车展,以及泰国改装车聚集地对应的知识点,...
宝马760报价,宝马760多少... 本篇文章极速百科给大家谈谈宝马760报价,宝马760多少钱一辆,以及宝马760的报价对应的知识点,希...
树莓派(3B):启动流程,系统... 目录 一,树莓派刷机及串口方式登陆 ① 准备工具 ② 操作步骤 二,配置...
【游戏逆向】《某某仙侠传》《疾... 不知道大家是否知道这样一种外挂 分解大量的商店装备,获得分解材料,然后拍卖行出售,赚取成本装备和材料...
react面试题 React是什么? React是一个开源前端JavaScript库,用于...