一、概述
 
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。没有统一的界面,所有的操作都是通过命令的方式进行提供.对于习惯了图形界面方式进行调试的猿猿来说可能不是很顺手,但是如果你在linux下面开发,却不得不适应,很多疑问和问题,都必须通过gdb去定位,用的久了,它除了没有像VC、BCB等
IDE的调试界面外,其它的功能相对于可视化的调试工具都有过之无不及。所以,熟练掌握和使用gdb的调试方法将会使你在linux下面编程时如沐春风,左右逢缘.
 
一般来说,GDB主要做的事情如下:
 
1、启动程序,可以随心所欲的运行程序。
2、可让程序在你希望的地方或者满足你的条件的地方停住,方便检查程序的运行情况.
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
 
乍一看,和vc等调试工具没什么两样,甚至显得寒碜(没有好看、可以用鼠标点点的界面).但是它就像少林寺的扫地僧一样,内力深厚,低调却奢华.
 
 
二、常用功能

 
  1. 启动程序

启动程序有以下场景:

  • 使用gdb命令进行启动,如:  gdb <procname>
  • 使用gdb进行启动程序,如:  gdb <procname>  procid .知道要调试的进程的进程ID,使用进程号进行附加.还可以直接使用下面的方法进行附加:            gdb进入界面,在命令行中使用 attach  procid 附加要要调试的进程,退出时使用detach取消挂接的进程.
  • 使用gdb <procname> corename打开进程core信息.

2、设置源代码搜索路径

 
      在gdb中,编译信息只包含代码文件名称,如果源代码和可执行程序不在同一个目录时需要增加源代码搜索路径.方法为:
      
     dir  <dirpath>. or  directory <dirpath>
 
     如果需要指定多个路径,;linux下面使用“:”进行分割.
    
    查看代码搜索路径的方法为:show directories
        
      3、断点
      
     断点可以设置在代码中的某一行或者某一个函数.

  • 在某一行中设置断点:break /  b    <filename:linenumber>
  • 在函数上设置断点:break / b  <filename:functionname>
  • 满足某一条件设置断点: break / b   if <condition>.  如:break / b   if  i=100
  • 在程序的运行内存地址处设置断点  break / b  *address

查看断点的信息: info break. 或者 info breakpoints

 
    删除所有断点为:delete  breakpoint 
 
    删除指定断点:delete   <breaknumber>; delete <breakpoint  number>
 
   4、运行
 
   设置完断点后,就可以运行程序,运行程序使用run命令,也可以使用简写 r 进行操作.使用方法如下:
  • 没有参数的: r or run
  • 有参数的程序:run / r  <启动参数> ;还可以使用set args命令设置进程参数,例如:set args 10 20 30 .设置完成后可以使用show args查看程序启动命令

程序启动执行后,可以使用n进行单步调试,也可以使用list命令打印程序代码源文件内容.list命令方法:

  • list   <number>. 显示当前运行文件number行前后代码行数
  • list <beginnumber,endnumber> 显示当前运行文件从beginnumber到endnumber的源代码行数
  • list <function>显示函数包含代码语句
  • list  -  显示当前代码行前面的代码
  • list  + 显示当前代码行后面的代码

打印程序变量信息可以使用p命令,如打印变量i的信息,直接使用 p i即可.也可以使用p   <容器名称(数组)>显示数组里面的内存信息

 
   打印栈信息:bt <+-n>. 向前或者向后显示栈内容, frame <n> 切换栈层次
 
    5、退出
      调试完成后使用quit命令退出即可.
 
三、高级功能
 
使用常用功能后基本可以解决工作中遇到的80%的问题,可以让我们胜任目前的工作,gdb提供了很多其它功能,可以让我们脱离平庸.在调试代码的过程中更近一步.
 
1、优雅的显示打印信息
  • set print pretty on   可以对输出的显示信息进行优雅的显示,可读性更强.set print pretty off关闭功能
  • 打印地址信息:set addr on。使用set addr off关闭打印地址信息
  • set array on,打开开关后会一行显示一个元素,关闭则每个元素以逗号分开.gdb中默认时关闭的.
  • set print elements <number of elements> 这个选项设置显示数组大小,如果指定了长度,达到长度后gdb就不会在显示.使用show print element可以显示选项信息.
  • set print null-stop <on/off> 打开后,遇到字符串结束后则终止打印.默认是关闭状态
  • set print union <on /off>  打开后显示联合体内数据
  • set print object <on / off> 如果一个对象指针指向派生类,打开后GDB按照虚方法调用规则进行打印,关闭的话GDB会忽略虚函数表.
  • set print vtbl <on / off>. 打开后gdb使用优雅的格式显示虚函数表.

2、执行shell命令

 
在gdb中使用shell   <shell命令> 即可执行要执行的命令,如 shell  cd /src/cpp则切换到指定目录.
 
3、info命令
  • info registers 查看寄存器情况
  • info all-registers 查看所有寄存器情况
  • info registers <name> 查看指定寄存器的情况
  • info frame 查看当前函数程序语言
  • info source 查看当前文件的程序语言

4、其它

  • call <function> 强制调用函数
  • return   <exp> 在函数没有执行完成之前结束函数执行
  • jump <linenumber /. addr >跳转到指定行数或者地址进行执行
  • set var $PI=3.14  在调试中设置代码变量值.

四、总结
 
  上面的介绍只是gdb中的一部分,掌握了这些基本可以扫清调试过程中遇到的问题,要想更清晰的了解gdb的使用,需要查看gdb官方帮助和使用手册.谢谢.
 

如果有问题请联系改成,本人公众号:CPP开发前沿,关注请扫二维码.

gdb调试常用方法介绍的更多相关文章

  1. linux程序调试命令addr2line之入门简单介绍(本文先不聊gdb调试)

    addr2line有什么作用呢? 可别小瞧它, 它能够定位到代码出错的位置. 以下, 我们来看看这个简单的代码: #include <stdio.h> int main() { int * ...

  2. Linux之GDB调试介绍与应用20170601

    一.GDB调试命令   描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或i) ...

  3. 使用GDB调试Go语言

    用Go语言已经有一段时间了,总结一下如何用GDB来调试它! ps:网上有很多文章都有描述,但是都不是很全面,这里将那些方法汇总一下 GDB简介  GDB是GNU开源组织发布的⼀一个强⼤大的UNIX下的 ...

  4. Eclipse+CDT+GDB调试android NDK程序(转)

    Eclipse+CDT+gdb调试android ndk程序 先介绍一下开发环境,在这个环境下,up主保证是没有问题的. ubuntu 11.10 eclipse 3.7(indego) for ja ...

  5. 使用 GDB 调试多进程程序

    使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...

  6. Linux GDB调试全面解析

    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序. 让被调试的程序在工程师指定的断 ...

  7. 转 C编译: 使用gdb调试

    C编译: 使用gdb调试   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! gdb是the GNU Debugger的简称.它是 ...

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

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

  9. 使用gdb调试多线程程序总结

    转:使用gdb调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程 ...

随机推荐

  1. 爬虫学习--Urllib库基本使用 Day1

    一.Urllib库详解 1.什么是Urllib Python内置的HTTP请求库 urllib.request    请求模块(模拟实现传入网址访问) urllib.error             ...

  2. wangkoala杂题总集(根据个人进度选更)

    CQOI2014 数三角形 首先一看题,先容斥一波,求出网格内选三个点所有的情况,也就是C(n*m,3);然后抛出行里三点共线的方案数:C(n,3)*m; 同理就有列中三点共线的方案数:n*C(m,3 ...

  3. 『题解』洛谷P2170 选学霸

    更好的阅读体验 Portal Portal1: Luogu Description 老师想从\(N\)名学生中选\(M\)人当学霸,但有\(K\)对人实力相当,如果实力相当的人中,一部分被选上,另一部 ...

  4. liunx查看日志 | 最实用命令和方法

    1.业务系统访问量不是很大的时候,使用这个,有bug的地方操作下,直接看最后操作的日志 tail  -fn100  catalina.log   查询日志尾部最后100行的日志,并且随文件;   2. ...

  5. html5 svg实现不规则形状图片触发事件

    html5 svg实现不规则形状图片触发事件<pre><!DOCTYPE html><html lang="en"> <head> ...

  6. 每天一道算法题-leetcode136-只出现一次的数字

    前言 打卡第一天 2019.10.26日打卡 算法,即解决问题的方法.同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的.这就需要我们学习算法,找出哪个算法更好. 大家都知道 ...

  7. Java基础语法07-面向对象-多态

    抽象类 抽象方法 : 没有方法体的方法. 抽象类:被abstract所修饰的类. 抽象类的语法格式: [权限修饰符] abstract class 类名{ }[权限修饰符] abstract clas ...

  8. SqlServer2005 查询 第二讲 distinct

    今天我们来说distinct关键字的用法. distinct - distinct:我们可以这样理解成[过滤重复值] - select distinct deptno from emp // -- 首 ...

  9. [深度学习][图像处理][毕设][笔记][安装环境][下载地址]安装VS2013、matconvnet、cuda、cudnn过程中产生的一些记录,2018.5.6号

    最近半个多月,被cuda等软件折磨的死去活来,昨天下午,终于安装好了环境,趁着matlab正在,在线下载VOT2016数据集,3点睡眼惺忪被闹醒后,睡不着,爬上来写这份记录. 先记录一下自己电脑的基本 ...

  10. 深入ObjC GCD中的dispatch group工作原理。

    本文是基于GCD的支持库libdispatch的源代码分析的结果或是用于作为源代码阅读的参考,尽量不帖代码,力求用UML图来说明工作流. 本文参考的源代码版本为v501.20.1,如有兴趣请自行到苹果 ...