最近使用GDB比较多,发现除了最常用的run、break、continue、next等命令的基本用法外,还有一些非常有用的命令和用法,能让你更加得心应手地使用GDB,在这里做了一下简单的总结。

1. run

当GDB的程序需要带参数运行时,除了使用set args外,还可以直接在run(r)后面带上参数,如下面两种方式是等价的:

2. set follow-fork-mode

有时候会发现GDB无法跟踪到设置的断点,原因可能是需要调试的进程是daemon进程或者fork的子进程,而GDB默认是只会Attach到父进程的。如果要调试子进程,必须在run之前设置follow-fork-mode,执行命令set follow-fork-mode child后在运行程序,就可以一路跟踪fork出的子进程;相对地,如果想停留在当前进程而不再进入子进程,则执行set follow-fork-mode parent即可。

3. print

print可以打印出当前上下文的变量值,print非常强大,除了打印整形等内置变量的值,还可以直接打印出结构体或类对象的值,如:

上图中的结构体有些复杂,打出来的格式不够清晰明了,这时就要使用set print pretty on,设置之后,打印出来的结构体的可读性就好了很多:

在上面的结构体中,buffer数组中的每个字节默认以字符的方式打印,如果是不可打印字符,则输出ASCII码,我们可能想直接打印出实际的二级制值,print可以设置输出数据的格式,如输出为十六进制(x)和十进制(d):

对于数组的输出,p array打印数组的所有元素,p array[i]打印下标为i的元素,如果想打印一段范围的元素,可以使用p array[i]@len,如:

print不仅可以打印变量的值,还可以直接打印函数和类成员方法的返回值,如:

4. finish

在单步调试时,除了next,还可以通过step进入到函数的内部,如果进入到一个很长的函数,而又想跳出该函数,我原来的做法是在调用的函数的下一条语句设置一个断点,其实最简单的方法是使用finish就可以完成当前函数的调用。同样通过finish,我们可以快速定位到调用当前函数的代码。

5. 条件断点

设置断点是我们在使用GDB时最常用的调试手段,有时候我们希望断点在特定的条件下生效,如输入参数满足一定的条件或者循环变量为特定的值,GDB的条件断点就是为此而生的,设置条件断点的方法是break if conditon,如:

break if input>10&&input<20

break if i%100==0

6. 设置变量值

GDB是如此强大,以至于你可以根据调试思路在调试过程中动态地设置变量的值,如改变变量的值以改变程序的执行路径,有两种方式可以设置:

(1)p v=value

(2)set v=value(如果变量名和GDB内置变量冲突,使用set var v=value)

示例如下:

GDB使用技巧的更多相关文章

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

    <软件调试的艺术>学习笔记——GDB使用技巧摘要 <软件调试的艺术>,因为名是The Art of Debugging with GDB, DDD, and Eclipse. ...

  2. GDB调试技巧:总结篇

    目录 一 写在开头 1.1 本文内容 二 学习资料 三 常用命令 四 调试技巧 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 1.1 本文内容 总结GDB调试的一些常用命令和调试 ...

  3. pwn 题GDB调试技巧和exp模板

    GDB分析ELF文件常用的调试技巧 gdb常用命令 首先是gbd+文件名 静态调试 ,gdb attach +文件名 动态调试 为了方便查看堆栈和寄存器 最好是安装peda插件 安装 可以通过pip直 ...

  4. GDB调试技巧

    1. 查看内存分布 (gdb) info proc mappings 2. 对于类的调试,先通过行号来设断点, 比如:(gdb) b TcpConnection.cc:63 3. 打印数组的内容 (g ...

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

    假设线上有一段php脚本,突然在某天出问题了,不处理但是进程没有退出.这种情况可能是异常休眠或者是有段死循环代码,但是我们怎么定位呢,我们这个时候最想知道的应该是这个脚本在此刻在做什么吧.这个是gdb ...

  6. 100个gdb调试技巧

    找到的一个有参考价值的关于GDB调试的站点:https://gitlore.com/subject/15

  7. GDB 调试技巧(不断更新中......)

    一.break到不同类的同名函数 方法: 在函数前面加类名以及作用域运算符 eg : break A::func //break 到类A的func函数 程序如下: //gdb_test.cpp #in ...

  8. gdb 小技巧

    https://www.gitbook.com/book/wizardforcel/100-gdb-tips/details

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

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

随机推荐

  1. 03-jQuery动画效果

    Query提供的一组网页中常见的动画效果,这些动画是标准的.有规律的效果:同时还提供给我们了自定义动画的功能. 显示动画 方式一: $("div").show(); 解释:无参数, ...

  2. OpenCV库框架结构

    在上文已经学习过了opencv的编码规则,为了能够方便灵活的运用OPECV库,我们需要对其框架结构进行学习了解,以方便我们进行实际工程调用调用. 1.Opnecv库到底提供了什么? 打开opencv源 ...

  3. 用嵌入式块RAM IP核配置一个双口RAM

    本次设计源码地址:http://download.csdn.net/detail/noticeable/9914173 实验现象:通过串口将数据发送到FPGA 中,通过quartus II 提供的in ...

  4. 基于DobboX的SOA服务集群搭建

    本人第一次发博客,有什么不对的地方希望各位批评指正,我就不把文章copy过来了,直接上有道笔记的链接,希望各位喜欢. 第一部分: 准备工作 第二部分: dubbox的安装和使用 第三部分: RESTf ...

  5. Java面试集合(三)

    前言 大家好,给大家带来Java面试集合(三)的概述,希望你们喜欢 三 1.在Java中是否可以含有多个类? 答:可以含有多个类,但只有一个是public类,public类的类名与文件名必须一致. 2 ...

  6. struts2框架学习笔记5:OGNL表达式

    OGNL取值范围分两部分,root.Context两部分 可以放置任何对象作为ROOT,CONTEXT中必须是Map键值对 示例: 准备工作: public void fun1() throws Ex ...

  7. Servlet案例7:jsp技术及案例

    jsp运行原理: 根据jsp文件创建java文件(servlet),并编译运行 第一次访问时会被翻译成servlet后执行 jsp三个指令: 1.page指令:页面翻译运行的属性的配置(通常使用默认) ...

  8. ElasticSearch权威指南学习(排序)

    排序方式 相关性排序 默认情况下,结果集会按照相关性进行排序 -- 相关性越高,排名越靠前. 相关性分值会用_score字段来给出一个浮点型的数值,所以默认情况下,结果集以_score进行倒序排列. ...

  9. HttpRunner框架(一)

    HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试.性能测试.线上监控.持续集成等多种测试需求. 中文使用文档地址:h ...

  10. DevOps - CI - 持续集成(Continuous Integration)

    初见 持续集成是什么? 持续集成基础概念介绍 持续集成服务器与工具集 了解 敏捷开发中的持续集成 使用Jenkins进行持续集成 案例 gitlab+gerrit+jenkins持续集成框架 使用Ge ...