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. 一步步搭建java信息管理系统00 - 前言

    开发前,先上效果图吧 信息管理系统,个人认为,以下几个因素是不可缺少的 多tab 因菜单比较多,右侧的树形一定要考虑,如果菜单还是多,那么顶部就要考虑起来了 以后想到什么,再添加吧. 看到easyui ...

  2. TensorFlow-GPU环境配置之三——安装bazel

    TensorFlow的源码需要使用bazel进行编译,所以需要安装bazel构建工具 1.安装JDK 8 sudo add-apt-repository ppa:webupd8team/java su ...

  3. Linux NFS服务器的安装与配置(转载)

    一.NFS服务简介 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操 ...

  4. 什么是Wiki?

    Wiki一词来源于夏威夷语的“wee kee wee kee”, 发音wiki, 原本是“快点快点”的意思,被译为“维基”或“维客”.一种多人协作的写作工具.Wiki站点可以有多人(甚至任何访问者)维 ...

  5. PLU Decomposition

    PLU分解的优点是,能够将Ax=b的矩阵,转换成Ly=b, Ux = y 的形式.当我们改变系数矩阵b时,此时因为矩阵L和U均是固定 的,所以总能高效的求出矩阵的解. // LU.cpp : Defi ...

  6. AES加密算法的C++实现

    摘要:作为新一代的加密标准,AES 旨在取代 DES(请看<DES加密算法的C++实现>),以适应当今分布式开放网络对数据加密安全性的要求.本文在分析了 AES 加密原理的基础上着重说明了 ...

  7. ASP.NET MVC不可或缺的部分——DI(IOC)容器及控制器重构的剖析

    ASP.NET MVC不可或缺的部分——DI(IOC)容器及控制器重构的剖析   IoC框架最本质的东西:反射或者EMIT来实例化对象.然后我们可以加上缓存,或者一些策略来控制对象的生命周期,比如是否 ...

  8. 实时人工智能:微软发布Project Brainwave预览版 现场可编程门阵列(Field Programmable Gate Array,简称FPGA) 硬件设计可以迅速演进

    https://mp.weixin.qq.com/s/bAPiPURZd-YsbV5PbzwpQQ 编者按:随着各大公司对于数据计算的要求越来越高,实时AI成为了研究者们关注的重点.在美国西雅图举行的 ...

  9. linux之安装软件出现Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)解决总结

    sudo rm -rf /var/lib/dpkg/lock sudo rm -rf /var/cache/apt/archives/lock

  10. Codeforces Round #267 (Div. 2) C. George and Job(DP)补题

    Codeforces Round #267 (Div. 2) C. George and Job题目链接请点击~ The new ITone 6 has been released recently ...