GDB 使用小结
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 使用小结的更多相关文章
- gdb命令小结
GDB命令小结 gdb <filename> : 调试指定程序文件 r : run 的简写,运行被调试程序, 如果此前没有下过断点,则执行完整个程序:如果有断点, 则程序暂停在第一个可用断 ...
- gdb调试小结
gdb最基本的调试命令. 1以调试程序test.cpp为例: 进入调试环境 gdb test 2.b 12 在文件的第12行设置断点. 删除断点: info b 列出所有的断点信息 (gdb) inf ...
- GDB堆栈跟踪与汇编调试
GDB堆栈跟踪与汇编调试 堆栈跟踪 源代码: 对预先编写的 stack.c 文件进行编译,并且使用 CGDB 进行调试,对堆栈进行跟踪,了解该代码堆栈是如何变化的. 在 CGDB 中,先设置 main ...
- TECH books
文章目录 TECH books linux vxworks bat c gdb c++ vbscript make java bash perl web uml software-misc cpu e ...
- Linux下分析bin文件的10种方法
这世界有10种人,一种人懂二进制,另一种人不懂二进制. --鲁迅 大家好,我是良许. 二进制文件是我们几乎每天都需要打交道的文件类型,但很少人知道他们的工作原理.这里所讲的二进制文件,是指一些可执行文 ...
- GDB调试命令小结
1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ...
- Linux调试工具strace和gdb常用命令小结
strace和gdb是Linux环境下的两个常用调试工具,这里是个人在使用过程中对这两个工具常用参数的总结,留作日后查看使用. strace调试工具 strace工具用于跟踪进程执行时的系统调用和所接 ...
- gdb常用命令小结
用了这么长时间gdb, 总结下常用用法: http://note.youdao.com/noteshare?id=4a2d1a34624f7197d8e2304c4beb4578
- gdb小结
testGdb.c #include<stdio.h> int getSum(int a,int b){ printf("a+b=%d\n",a+b); return ...
随机推荐
- jQuery—— jQuery get方法+一般处理程序处理文本框内容
网上常常看到这种交互方式,当去一个站点注冊username的时候,假设文本框内没有输入数据,或者数据输入的内容格式不正确.就会将文本框变成红色来提示你输入的内容有误. 自己将这个文本框验证的方式改变了 ...
- x86CPU 实模式 保护模式 傻傻分不清楚? 基于Xv6-OS 分析CR0 寄存器
基于Xv6-OS 分析CR0 寄存器 之前一直认为晕乎乎的...啥?什么时候切换real model,怎么切换,为什么要切换? ------------------------------------ ...
- Oracle Warehouse Builder(OWB) 安装报seeding owbsys错误的解决
今天在RHEL6.4上安装Oracle Warehouse Builder 11.2时在最后一步报错,打开日志查看有例如以下信息: main.TaskScheduler timer[5]2014052 ...
- Java解惑四:异常之谜
谜题36 finally语句中的return语句会覆盖掉try语句中的. 谜题37 该部分还须要进一步理解 一个方法能够抛出的被检查异常集合是它所适用的全部类型声明要抛出的被检查集合的交集.
- Rational 最新软件试用下载地址
看到非常多 TX 都在问老版本号 Raitonal 软件相关的问题,可是因为产品升级的时候有非常多名字都发生了更改(比方说 Rational Rose 最新的版本号变成了 Rational Softw ...
- Linux下Gcc 的编译过程
在linux下开发难免会用到gcc编译.GCC(GNU Compiler Collection.GNU编译器套装),是由 GNU 开发的编程语言编译器.它是GNU编译器套装以GPL许可证所发行的自由软 ...
- 基于AR谱特征的声目标识别
本文第一部分先解释AR谱,但并不会给出太多的细节,第二部分介绍几种常见的语音中的特征.有些在之前的博文中已经用过.诸如过零率. 第三部分给出实际操作的过程及识别的效果.本文的目标是通过对DSP採集的声 ...
- Codeforces Round #344 (Div. 2) E. Product Sum 二分斜率优化DP
E. Product Sum Blake is the boss of Kris, however, this doesn't spoil their friendship. They often ...
- 【HDU 3652】 B-numbers
[题目链接] 点击打开链接 [算法] 数位DP f[i][j][k][l]表示i位数,第一位为j,除以13的余数为k,是/否包括子串“13”的方案数 当然,我们也可以先打表,然后,对于每次询问,二分即 ...
- Joseph问题 (线段树)
Joseph问题似乎是入门题,就是那个报数出圈的问题,不过它暴力模拟的复杂度是O(nm)的,如果题目的数据范围达到了30000,那就超时了.怎么用线段树维护呢? 我们可以这么考虑,每次我们其实要查询在 ...