GDB调试工具

GDB调试工具

   

Mascot:射水鱼

GDB官网:    https://www.gnu.org/software/gdb/                                    

GDB适用的编程语言: Ada / C / C++ / objective-c / Pascal 等。

GDB的工作方式:  本地调试和远程调试。

目前release的最新版本为8.0,GDB可以运行在Linux 和Windows 操作系统上。

 

1. GDB简介

1.1 what is GDB?

  (1)GDB【gnu debuger】是GNU 开源组织发布的一个强大的UNIX 下的程序调试工具。

  (2)能够跟踪程序的执行【execute】,观察程序运行时内部的状态;当程序崩溃时【crashed】,查看程序崩溃前的状态。

1.2 GDB的四大功能  (plus other things in support of these)

  (1)自定义程序的启动方式(指定影响程序运行时的参数)

  (2)设置断点

  (3)回溯检查导致程序异常结束的原因  【core dump】

  (4)动态改变程序执行流        【可以跳过一些代码以此定位出问题的地方】

1.3 为什么需要 GDB?

  (1)软件不是一次性开发完成的,在软件开发的任何阶段都有可能存在bug

  (2)调试是软件开发中不可或缺的技术,调试工具对于软件开发很重要

2. GDB 和binutils工具集区别

  GDB是动态分析工具,binutils工具集是静态分析工具。

3. gdb的启动及退出

3.1 gdb的启动

  gdb的启动方式有3种,这3种方式分别适用不同的场合下。

  (1) gdb <program>

  这种方式是在GDB内操作可执行程序,可以在shell命令行输入gdb <program> 或者进入gdb后输入file <program>

  

  (2)gdb <program> core

  当程序执行发生异常时,会发生核心转储(core dump),产生core文件。可以使用gdb对core文件进行分析,定位问题所在的文件代码行。

  (3)gdb attach pid

  gdb可以动态的连接到一个进程上,使用之前使用 ps -aux 查看想要连接的进程的PID号。

3.2 gdb的退出

  使用 quit  /  q  /  crtl +d  退出gdb。

Tips】 使用GDB前需要完成的工作

  (1)在编译C/C++源码时,需要添加 -g 选项,将调试信息添加到可执行文件中,供gdb使用

  (2)Linux下默认是不产生core文件的,要使用 umilit -c unlimited 命令进行设置,这样才能产生供gdb使用的core文件

4. 使用GDB进行断点调试

  

4.1 程序断点

  程序断点就是指处理器指令断点,通俗的解释就是:当程序运行到某个地方时,我们希望程序停下来,即程序“断了”!停下来的目的,就是让程序员检查当前程序运行的状态。对于软件开发人员来说,程序断点是调试程序的必须手段,在嵌入式软件开发中,对程序断点进行了区分:软件程序断点和硬件程序断点。

4.1.1 软件程序断点

  原理:处理器在运行程序的过程中,如果遇到一条非法的指令就会产生一个异常中断,程序就会停下来。软件程序断点就是利用这个特性来实现的,当我们设置了一个断点后,调试工具就在断点的位置放置一条非法的指令,同时将被替换的指令保留起来。当程序运行到了被非法指令替换的地方时,处理器所产生的异常中断一方面在中断服务程序中恢复被替换的指令,另一方面将控制权交给调试工具。从理论上说,软件程序断点可以设置n个,n的大小由内存容量决定。

在介绍硬件程序断点时,我们先要问一问,为什么要引入硬件程序断点。引入一种新的概念,往往意味着老的概念存在一定的局限性。那软件程序断点存在什么局限性呢?想想看,在嵌入式系统中,如果我们想调试一个boot loader(参见《什么是boot loader》一文),而此时处理器还在运行位于FLASH中的程序,此时软件程序断点这种方法还有效吗?当然不行,因为FLASH中的内容并不能像内存一样,被处理器通过一个写操作直接更改。在FLASH中更改内容(或称对FLASH进行编程)存在一定的协议,而显然处理器不会去实现这一协议的,这会严重影响处理器的通用性。此外,即使实现了,其效率也不会高。即然这样,软件程序断点不能运用到boot loader的调试中去。解决方法时什么呢?就是处理器提供一定的寄存器用于存放程序的断点位置,当我们通过调试工具设置断点时,调试程序会将所需中断的指令地址放入到处理器的程序中断寄存器中。显然,处理器的这种寄存器是有限的,因此,我们不能设置n个。

4.1.2 硬件程序断点

  原理

4.2 数据断点

 

 【参考资料】

[1] 程序断点与数据段点  http://yunli.blog.51cto.com/831344/196353/

[2] ff 

posted @ 2017-07-28 09:53  Hengs  阅读(304)  评论(0编辑  收藏  举报