GDB 使用小结

Gdb 不用说,两个字,非常强大 >.<,我最讨厌不识数的人了

本文适合GDB 初学和没学过的,如果你懂了,可以相互交流

既然说它很强大,它强大在哪里呢?

一般情况下,大部分人使用VS 自带的调试器来调试BUG ,直观,清晰。

在Linux下,为什么还要苦苦选择这样一个命令行工具呢?

关于CMD 与 图形界面的事情不想再说....囧

开始我们的GDB 小旅

首先来调试一个很小的程序:

程序够简单吧,一目了然

可以不加 #include <stdio.h>

黑喂狗~

编译选项 cc -g endin.c -o endin

这里的 endin.c 是我电脑上的文件名,你自己选一个你喜欢的就OK

注意编译选项一定要加 -g ,这个是为GDB 保留源程序的符号表选项,不然一会儿你加载程序将出现问题。

ok, 生成二进制 endin文件以后

gdb -q ./endin

-q 的目的在于消除广告,你懂得

现在提示

(gdb)_

开始介绍命令

(gdb) ls 1 , n (n = 1,2,3.....n )

比如  li 1,20   或者简写为 l 1,20 将源程序的第1-20行列出来

ok,下一步,根据行,我们可以下断点

(gdb)b 2

在第2行下断点

(gdb)b 10

在第10行下断点

提示断点成功

(gdb) run

开始运行程序,到断点时候会停下来

(gdb) info locals   (查看当前函数局部变量)

可以看到,出现了 x 和 buf ,len 三个局部变量

现在我们的目标是 buf

(gdb)x/32xb buf

这样,我们就可以查看关于buf 里面的内容

(gdb)x 是检查的意思,32是查看多少位,比如 12 , 55 ... 各种的,可以指定不同的格式

比如

(gdb)x/s buf

以字符流的形式来查看 buf

(gdb)x/32xw buf

以十六进制方式查看

(gdb)x/10b buf

以十进制查看

各种的... 以上的方式够用了

还有一种方式是利用

(gdb)print (value) 形式来

比如

(gdb)print buf

这样来查看变量,其实还可以设置变量等,这里就不一一列举了

在来看看关于最头疼的段错误问题,很多人在遇到程序收到异常信号的时候无法调试

其实很简单,gdb提供了查看堆栈的操作,很多调试器都提供了

(gdb)backtrack或者直接 (gdb)bt

我们来模拟一个段错误

退出(gdb)quit

加上第11 行代码,很明显我们的意图

同样编译运行代码后出现

现在假设我们不知道问题出在哪里,但是我们得事先有一个大致的定位

提示出现很多关于 stack 和 Memory map ,我们这个时候得大致有一个认识这种错误一般是发生了段违规,也就是访问越界或者使用了未初始化的指针等情况。好了,现在gdb 登场了

gdb -q ./endin

直接(gdb)run

可以看到,调用堆栈的情况,从下往上看,在main() 函数上面的#5 检查栈(stack)使用情况,注意是栈,不是堆,检查失败。发送失败信息,接着调用__libc_message()函数,这个是标准C 的输出函数,然后向上,#2 abort() 退出,#1发起一个信号,信号sig=6 是退出信号。然后#0 __kernel_vsyscall() 函数调用

整个过程就大致清楚了,我们在检查 stack 的时候产生了错误输出,必定是栈访问违规引起,其实未初始化指针是另外一种状况。

这里因为涉及到调用堆栈递归层次比较少,看不出优越性。当程序较大的时候可以看出来。

下面让我们来看看未初始化指针的情况。这个问题常常遇到,但是很多人找不到解决方案,其实很简单。

我们再修改一下程序

在第13 和第 14 行,我们加入了一个未初始化的指针,并且我们在后面给他赋值

运行一下看结果

程序提示Segmentation fault

现在这种情况应该有一个直观的影响就是使用了未初始化的指针。那么我们该怎么办?

继续(gdb)run

看,gdb 清楚的给我打印出错误锁在行数和代码位置。下次这种问题还会出现么?

事实上,还有很多东西没有例举出来的,今天就到这里吧

GDB 使用小结的更多相关文章

  1. gdb命令小结

    GDB命令小结 gdb <filename> : 调试指定程序文件 r : run 的简写,运行被调试程序, 如果此前没有下过断点,则执行完整个程序:如果有断点, 则程序暂停在第一个可用断 ...

  2. gdb调试小结

    gdb最基本的调试命令. 1以调试程序test.cpp为例: 进入调试环境 gdb test 2.b 12 在文件的第12行设置断点. 删除断点: info b 列出所有的断点信息 (gdb) inf ...

  3. GDB堆栈跟踪与汇编调试

    GDB堆栈跟踪与汇编调试 堆栈跟踪 源代码: 对预先编写的 stack.c 文件进行编译,并且使用 CGDB 进行调试,对堆栈进行跟踪,了解该代码堆栈是如何变化的. 在 CGDB 中,先设置 main ...

  4. TECH books

    文章目录 TECH books linux vxworks bat c gdb c++ vbscript make java bash perl web uml software-misc cpu e ...

  5. Linux下分析bin文件的10种方法

    这世界有10种人,一种人懂二进制,另一种人不懂二进制. --鲁迅 大家好,我是良许. 二进制文件是我们几乎每天都需要打交道的文件类型,但很少人知道他们的工作原理.这里所讲的二进制文件,是指一些可执行文 ...

  6. GDB调试命令小结

    1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ...

  7. Linux调试工具strace和gdb常用命令小结

    strace和gdb是Linux环境下的两个常用调试工具,这里是个人在使用过程中对这两个工具常用参数的总结,留作日后查看使用. strace调试工具 strace工具用于跟踪进程执行时的系统调用和所接 ...

  8. gdb常用命令小结

    用了这么长时间gdb, 总结下常用用法: http://note.youdao.com/noteshare?id=4a2d1a34624f7197d8e2304c4beb4578

  9. gdb小结

    testGdb.c #include<stdio.h> int getSum(int a,int b){ printf("a+b=%d\n",a+b); return ...

随机推荐

  1. FTP指令说明

    安装vsftpd: listen=YES: 是否监听端口 anonymous_enable=NO: 是否启用匿名用户 local_enable=YES: 是否允许本地用户登录 write_enable ...

  2. web常见之音乐播放器

    代码来源于:这位Github小伙伴,我只负责解说! 效果图如下: 先上HTML代码 源码: <!DOCTYPE html> <html> <head> <me ...

  3. POJ2155 Matrix 【二维树状数组】+【段更新点查询】

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17766   Accepted: 6674 Descripti ...

  4. 【CERC2008】【BZOJ4319】Suffix reconstruction

    Description 话说练习后缀数组时,小C 刷遍 poj 后缀数组题. 各类字符串题闻之丧胆.就在准备对敌方武将发出连环杀时,对方一记无中生有,又一招顺 手牵羊.小C 程序中的原字符数组就被牵走 ...

  5. 分布式数据库DDM Sidecar模式负载均衡

    简介 1.分布式数据库中间件 DDM 分布式数据库中间件(Distributed Database Middleware)是解决数据库容量.性能瓶颈和分布式扩展问题的中间件服务,提供分库分表.读写分离 ...

  6. [办公自动化]如何让excel图表标签中显示最新值数据

    同事做了一张excel图表,希望最新的数据显示数据标签,其他都不显示.并且当单元格的数据新增加时,这个标签要能自动更新. 这里需要用到公式,获取到这个最新值.在b2输入公式=lookup(9e+307 ...

  7. 容器HashMap原理(学习)

    一.概述 基于哈希表的 Map 接口的非同步实现,允许使用 null 值和 null 键,不保证映射的顺序 二.数据结构 HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体:Has ...

  8. Aaron Swartz Rewriting Reddit中关于web.py的创建思路

    这天才少年居然自杀了,哎 原文点这 So how should things work? The first principle is that code should be clear and si ...

  9. POJ1664 计数 DP

      题目传送门 http://poj.org/problem?id=1664 设$dp[i][j]$表示$i$个苹果放在$j$个盘子里的总数 $1.$ 当 苹果数 小于 盘子数 $(M < N) ...

  10. sql的where条件中包含中文,查询不出来的处理方法

    SELECT  * FROM phonenumber_info where PROVANCE=N'广东' and  CITY=N'中山市'