一、概述
 
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. NOIP模拟14-16

    最近事情有些多,先咕了! 鸽了,时间太久远了,写了话坑太大,太费时间了!

  2. Vue 项目添加单元测试发现的问题及解决

    用 Jest 测试单文件组件 1.安装 Jest 和 Vue Test Utils npm install --save-dev jest @vue/test-utils 2.配置 package.j ...

  3. [LC]237题 Delete Node in a Linked List (删除链表中的节点)(链表)

    ①中文题目 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入: hea ...

  4. [剑指offer]第1题,二维数组中的查找

    ①题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  5. iOS核心动画高级技巧-1

    1. 图层树 图层的树状结构 巨妖有图层,洋葱也有图层,你有吗?我们都有图层 -- 史莱克 Core Animation其实是一个令人误解的命名.你可能认为它只是用来做动画的,但实际上它是从一个叫做L ...

  6. iOS界面流畅技巧之微博 Demo 性能优化技巧

    微博 Demo 性能优化技巧 我为了演示 YYKit 的功能,实现了微博和 Twitter 的 Demo,并为它们做了不少性能优化,下面就是优化时用到的一些技巧. 预排版 当获取到 API JSON ...

  7. Spring Cloud Alibaba(四)实现Dubbo服务消费

    本项目演示如何使用 Spring Cloud Alibaba 完成 Dubbo 的RPC调用. Spring Cloud与Dubbo Spring Cloud是一套完整的微服务架构方案 Dubbo是国 ...

  8. ASP.NET Core gRPC 使用 Consul 服务注册发现

    一. 前言 gRPC 在当前最常见的应用就是在微服务场景中,所以不可避免的会有服务注册与发现问题,我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心,本文主要介绍 ...

  9. Android的系统框架

    Android的系统架构采用了分层架构的思想,如图1所示.从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核.  图1:Android系统架构图 每 ...

  10. JavaScript笔记七

    1.函数 - 返回值,就是函数执行的结果. - 使用return 来设置函数的返回值. - 语法:return 值; - 该值就会成为函数的返回值,可以通过一个变量来接收返回值 - return后边的 ...