gdb调试技巧

使用命令:

display 变量名跟踪查看某个变量,每次停下来都显示它的值

undisplay 跟踪显示号取消跟踪显示

info(或i) breakpoints查看当前设置了哪些断点

例如:

disable breakpoints 3

(gdb) enable 3

(gdb) i breakpoints

(gdb) delete breakpoints

gdb) break 9 if sum != 0

(gdb) info registers

(gdb) disassemble main

本文的主要内容是讲如何用GDB来查看C/C++程序中函数调用栈(call stack)的相关信息,通过介绍一些相关的命令及其用法,让读者朋友能够循序渐进了解调用栈的各个方面,更好的驾驭程序。下面开始今天的内容。

我们知道,通常一个程序的运行,不外乎是A函数调用B,B函数调用C等等,等所有的调用都完成后,整个程序的运行也就ok了。在这个过程中,每当有新的函数调用,系统都会把该函数的一些信息,包括函数的参数,以及一些寄存器的值等,保存到调用栈(call stack)上。等该函数运行完成后,这些信息再从调用栈上弹出(pop)。如下图所示,是一个完整的调用栈:

在上图中,整体叫做调用栈(call stack),每一行叫做一桢(frame)。我们来看看桢信息的组成有哪些:

  • (1)桢号:调用栈中对桢的一个编号,从0开始,依次增大
  • (2)PC:Program counter寄存器,指向当前桢中下一条要执行的指令的地址
  • (3)函数名:当前桢中被调用的函数的名字
  • (4)参数及传入的值:当前桢中被调用的函数在调用时传入的参数及其值
  • (5)源码位置:当前桢执行到的源码位置,格式为 file:linenum

    这里还有一点需要说明,不知道细心的读者朋友有没有发现,foo那一桢没有PC的地址,GDB通过这样来标示该桢是当前正在执行到的桢,因此我们通过看调用栈的信息,便可得知程序执行到哪里了。

    读者朋友有没有觉得原来函数调用的过程还有这么多信息可以知道啊,下面我就开始介绍一些GDB命令,通过这些命令你便可以查看到上面介绍的这些信息,甚至更加详细的信息。

    1. 查看调用栈信息:(具体信息的内容,与上面第二部分中介绍的相同)

  • (1)backtrace: 显示程序的调用栈信息,可以用bt缩写
  • (2)backtrace n: 显示程序的调用栈信息,只显示栈顶n桢(frame)
  • (3)backtrace -n: 显示程序的调用栈信息,只显示栈底部n桢(frame)
  • (4)set backtrace limit n: 设置bt显示的最大桢层数
  • (5)where, info stack:都是bt的别名,功能一样

    2. 查看桢信息:
  • (1)frame n: 查看第n桢的信息, frame可以用f缩写
  • (2)frame addr: 查看pc地址为addr的桢的相关信息
  • (3)up n: 查看当前桢上面第n桢的信息
  • (4)down n: 查看当前桢下面第n桢的信息

    3. 查看更加详细的信息:
  • (1)info frameinfo frame n或者info frame
    addr

    查看指定桢的详细信息,关于详细信息的内容,这里有必要做一个介绍,如下图所示:

    上图中显示的信息有:

    a. 当前桢的地址: 0xbffff400

    b. 当前桢PC: eip = 0×8048516

    c. 当前桢函数: bar (test.cpp:16)

    d. caller桢的PC: saved eip 0×8048535

    e. caller桢的地址: called by frame at 0xbffff420

    f. callee桢的地址: caller of frame at 0xbffff3e0

    g. 源代码所用的程序的语言(c/c++): source language c++

    h. 当前桢的参数的地址及值: Arglist at 0xbffff3f8, args: name=0×8048621 “jessie”, myname=0x804861c “jack”

    i. 当前相中局部变量的地址:Locals at 0xbffff3f8, Previous frame’s sp is 0xbffff400

    k. 当前桢中存储的寄存器: Saved registers: ebp at 0xbffff3f8, eip at 0xbffff3fc

  • (2)info args:查看当前桢中的参数
  • (3)info locals:查看当前桢中的局部变量
  • (4)info catch:查看当前桢中的异常处理器(exception handlers)
  • 参考文献:http://blog.chinaunix.net/uid-20760757-id-1872361.html

    时间: 2024-10-13 04:30:16

    gdb调试技巧的相关文章

    pwn 题GDB调试技巧和exp模板

    GDB分析ELF文件常用的调试技巧 gdb常用命令 首先是gbd+文件名 静态调试 ,gdb attach +文件名 动态调试 为了方便查看堆栈和寄存器 最好是安装peda插件 安装 可以通过pip直接安装,也可以从github上下载安装 $ pip install peda $ git clone https://github.com/longld/peda.git ~/peda $ echo "source ~/peda/peda.py" >> ~/.gdbinit 命

    GDB调试技巧:常用命令

    一 写在开头 1.1 本文内容 总结GDB调试的一些常用命令.不定期更新. 二 常用命令 GDB和VIM一样,功能异常强大,但要熟练掌握它却很需要费时间.不过,尽管它们两个的命令多如牛毛,但只要掌握最常用的那几个命令就可以快速上手.下面的列表总结了GDB最常用的几个命令. 简写 全称 备注 l list 显示指定行号或者指定函数附近的源代码 b break 在指定行号或者指定函数开头处设置断点.如b main r run 运行程序,直到程序结束或者遇到断点而停下 c continue 在程序中断

    gdb调试技巧 找到php执行进程当前执行的代码

    假设线上有一段php脚本,突然在某天出问题了,不处理但是进程没有退出.这种情况可能是异常休眠或者是有段死循环代码,但是我们怎么定位呢,我们这个时候最想知道的应该是这个脚本在此刻在做什么吧.这个是gdb+zbacktrace就有用了 首先随便写一个测试脚本test.php,里面就写一个sleep函数,换成死循环也可以. <?php function Mecho($i){ echo $i.PHP_EOL; } $i = 20; while($i>0){ if($i%2==0){ Mecho($i)

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

    引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代得到了迅猛的发展, 这时候的李纳斯还躺在祖父公寓的摇篮里睡大觉,如果不是后来 Unix 王国自乱阵脚, 出现阵营分裂和法律纠纷,可能 Linux 系统根本都不会出现.真实的情况是, Unix 浪费了大把的时间和机会,似乎就是为了等待这个大鼻子.头发纷乱的芬兰小子长大,然后一决高下. 李纳斯赢得了自己

    gdb调试运行时的程序小技巧

    使用gdb调试运行时的程序小技巧 标签: 未分类 gdb pstack | 发表时间:2012-10-15 04:32 | 作者:士豪 分享到: 出处:http://rdc.taobao.com/blog/cs 原创文章,欢迎转载.转载请注明:转载自淘宝核心系统团队博客,谢谢! 原文链接地址: 使用gdb调试运行时的程序小技巧 下面介绍我调试时经常遇到的三种问题,如果大家也有类似的问题交流一下解决方法: 情景1:在不中止程序服务的情况下,怎么调试正在运行时的程序 情景2:需要同时看几个变量的值或

    [转]使用gdb调试运行时的程序小技巧

    原创文章,欢迎转载.转载请注明:转载自淘宝核心系统团队博客,谢谢!原文链接地址:使用gdb调试运行时的程序小技巧 下面介绍我调试时经常遇到的三种问题,如果大家也有类似的问题交流一下解决方法:情景1:在不中止程序服务的情况下,怎么调试正在运行时的程序情景2:需要同时看几个变量的值或者批量查看多个core文件的堆栈信息怎么办情景3:遇到需要查看.队列.链表.树.堆等数据结构里的变量怎么办1. 情景1:在不中止程序服务的情况下,怎么调试正在运行时的程序我们在生产环境或者测试环境,会遇到一些异常,我们需

    《软件调试的艺术》学习笔记——GDB使用技巧摘要

    <软件调试的艺术>学习笔记——GDB使用技巧摘要 <软件调试的艺术>,因为名是The Art of Debugging with GDB, DDD, and Eclipse. 作者是美国的Norman Matloff和Peter Jay Salzman,中文版由张云翻译.是人邮出版社图灵程序设计丛书初版.这里称为"艺术",个人觉得有点过了,但是其中关于gdb以及在gdb基础之上集成的DDD和Eclipse调试技巧的整理确实是做的很好,对于Linux/开源社区下的

    iOS开发——调试篇&amp;Xcode常用调试技巧

    Xcode常用调试技巧 Enable NSZombie Objects(开启僵尸对象) Enable NSZombie Objects可能是整个Xcode开发环境中最有用的调试技巧.这个技巧非常非常容易追踪到重复释放的问题.该技巧会以非常简洁的方式打印指出重复释放的类和该类的内存地址. 怎么开启僵尸对象呢?首先打开“Edit Scheme”(或者通过热键?<),然后选择Diagnostics选项卡,勾选Enable NSZombie Objects选项. 现在我们可以关掉ARC来测试重复释放的问

    Linux c c++ 开发调试技巧

    看到一篇介绍 linux c/c++ 开发调试技巧的文章,感觉挺使用,哪来和大家分享. 通向 UNIX 天堂的 10 个阶梯Author: Arpan Sen, 高级技术人员, Systems Documentation, Inc. (SDI) 讨论几种可以帮助 C++ 开发人员节省时间的技巧和免费工具. C++ 开发人员在日常工作中通常要完成多个任务:开发新软件.调试其他人的代码.制订测试计划.为每个计划开发测试.管理衰退软件(regression suite)等等.在多种角色之间频繁转换会消