用 GDB 调试程序

GDB 概述
————

GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像 VC 、 BCB 等 IDE 的调试,但如果你是在 UNIX 平台下做软件,你会发现 GDB 这个调试工具有比 VC 、 BCB 的图形化调试器更强大的功能。所谓 “ 寸有所长,尺有所短 ” 就是这个道理。

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

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

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

一个调试示例
——————

源程序: tst.c

1 #include <stdio.h>
     2
     3 int func(int n)
     4 {
     5         int sum=0,i;
     6         for(i=0; i<n; i++)
     7         {
     8                 sum+=i;
     9         }
    10         return sum;
    11 }
    12
    13
    14 main()
    15 {
    16         int i;
    17         long result = 0;
    18         for(i=1; i<=100; i++)
    19         {
    20                 result += i;
    21         }
    22
    23        printf("result[1-100] = %ld /n", result );
    24        printf("result[1-250] = %d /n", func(250) );
    25 }

编译生成执行文件:( Linux 下)
    hchen/test> g++ -g -Wall tst.c -o tst

使用 GDB 调试:

hchen/test> gdb ./tst <---------- 启动 GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-suse-linux"...
(gdb) l     <-------------------- l 命令相当于 list ,从第一行开始例出原码。
1        #include <stdio.h>
2
3        int func(int n)
4        {
5                int sum=0,i;
6                for(i=0; i<n; i++)
7                {
8                        sum+=i;
9                }
10               return sum;
(gdb)       <-------------------- 直接回车表示,重复上一次命令
11       }
12
13
14       main()
15       {
16               int i;
17               long result = 0;
18               for(i=1; i<=100; i++)
19               {
20                       result += i;   
(gdb) break 16    <-------------------- 设置断点,在源程序第 16 行处。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func <-------------------- 设置断点,在函数 func() 入口处。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break <-------------------- 查看断点信息。
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08048496 in main at tst.c:16
2   breakpoint     keep y   0x08048456 in func at tst.c:5
(gdb) r           <--------------------- 运行程序, run 命令简写
Starting program: /home/hchen/test/tst

Breakpoint 1, main () at tst.c:17    <---------- 在断点处停住。
17               long result = 0;
(gdb) n          <--------------------- 单条语句执行, next 命令简写。
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) n
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) c          <--------------------- 继续运行程序, continue 命令简写。
Continuing.
result[1-100] = 5050       <---------- 程序输出。

Breakpoint 2, func (n=250) at tst.c:5
5                int sum=0,i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p i        <--------------------- 打印变量 i 的值, print 命令简写。
$1 = 134513808
(gdb) n
8                        sum+=i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8                        sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt        <--------------------- 查看函数堆栈。
#0 func (n=250) at tst.c:5
#1 0x080484e4 in main () at tst.c:24
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish    <--------------------- 退出函数。
Run till exit from #0 func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24              printf("result[1-250] = %d /n", func(250) );
Value returned is $6 = 31375
(gdb) c     <--------------------- 继续运行。
Continuing.
result[1-250] = 31375    <---------- 程序输出。

Program exited with code 027. <-------- 程序退出,调试结束。
(gdb) q     <--------------------- 退出 gdb 。
hchen/test>

gdb 调试 入手 实例讲解-转相关推荐

  1. NX程序调试方法实例讲解

    ** 第一步:打开需要调试的Project ** 运行一下程序,看程序运行是否成功生成dll文件. 第二步:打开NX 打开程序需要的许可运行环境 第三步:在VS中,选择调试OR工具–>附加到进程 ...

  2. java 调试 gdb_android gdb 调试实例演示(有源代码篇)

    android ndk代码的调试本身还是有点麻烦的,因为本身google android的sdk 主要是面向广大的java程序员的,所以后来发布的 ADT 集成开发环境对java的代码调试 支持还是很 ...

  3. GDB 调试命令讲解-转

    首 先需要肯定一点,GDB是个功能异常强大的调试工具,其本身只能运行于字符模式,但是当前众多基于GUI的调试器/IDE,无论是自由软件还是商业软件, 绝大多数都使用GDB作为其后端(但这些基于GUI的 ...

  4. linux下使用gdb调试崩溃和死锁实例

    gdb是linux下一款功能强大的调试工具,windows下对应的有windbg,下面举例说明常见程序错误解决方法 1.gdb启动 要想使用gdb调试,编译时指定-g选项加入调试信息,gdb可以启动执 ...

  5. 【软件开发底层知识修炼】十四 快速学习GDB调试一 入门使用

    前面几篇文章学习了链接器相关的内容.现在开始来学习GDB调试.我们的目的是通过这几篇文章将GDB调试完全学会. 文章目录 1 为什么需要GDB 2 GDB 的常规应用 3 GDB调试程序实例 4 总结 ...

  6. gdb调试lua_gdb 调试入门,大牛写的高质量指南

    原标题:gdb 调试入门,大牛写的高质量指南 (点击上方公众号,可快速关注) 来源: 伯乐在线 - 道法子 如需转载,发送「转载」二字查看说明 没想到Brendan Gregg这样的大牛,会写出这样一 ...

  7. Linux基础 30分钟GDB调试快速突破

    引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代 ...

  8. ARIMA模型实例讲解——网络流量预测可以使用啊

    ARIMA模型实例讲解:时间序列预测需要多少历史数据? from:https://www.leiphone.com/news/201704/6zgOPEjmlvMpfvaB.html   雷锋网按:本 ...

  9. DPDK之makefile编译选项修改和gdb调试(三)

    摘要 intel dpdk 的makefile 写的很好,该好好学习他的这种架构,但在调试程序时候发现,它的编译选项优化级别很高:怎样去修改intel dpdk中的编译选项,达到自己一个一个满意的程度 ...

最新文章

  1. [angularjs] angularjs系列笔记(四)控制器
  2. EVA 4400存储数据恢复报告
  3. sysfs API总结
  4. 56py无锡官方网站2013最新
  5. 有个地方叫做成都,有些菜叫川菜
  6. C语言获取linux接口状态,[linux] C语言Linux系统编程-TCP通信的11种状态
  7. 全网最全Linux命令总结!!(史上最全,建议收藏)
  8. hdu 6080 度度熊保护村庄(floydS使用技巧)
  9. 四阶行列式如何降阶_四阶行列式的计算方法
  10. 算法:泽勒的一致性 给定一个日期,输出这个日期是该年一周中的星期几 【c++ java python版本】
  11. 游戏对战平台编写流程研究
  12. 英语发音规则---P字母
  13. nginx使用ngx_shared_memory_add和ngx_slab_alloc等在共享内存里创建一棵红黑树
  14. glib linux,[转载]linux下glib.h的介绍
  15. 用vb.net写一个简易的RSS阅读器
  16. tensorflow 版本列表_tensorflow各个版本的CUDA以及Cudnn版本对应关系
  17. 华为android是什么手机,为什么说华为的麒麟810是一代神U?
  18. 事件坐标:screenX,clientX,pageX,offsetX的区别
  19. Alfresco/Activit 中文乱码问题的解决
  20. Android TV Demo 工程,其中包含 TV 常用的自定义控件,飞框效果实现,外边框效果实现,UI 控件焦点自动处理,使 TV 开发更简单,更高效。

热门文章

  1. 算法学习(四)冒泡排序
  2. MySQL日志及主从复制实现
  3. [Python]输入与输出
  4. Django框架简介-开头
  5. 洛谷——P1927 防护伞
  6. android 实现代码混淆
  7. 利用单壁路由实现vlan间路由
  8. 利用ClustrMaps | GoStats | 51la | Google Analytics统计和分析访问量
  9. 微软:SolarWinds 供应链攻击事件幕后黑手攻击全球24国政府
  10. 如何查看Oracle数据库字符集 尚未研究