Mascot:射水鱼程序员
GDB官网: https://www.gnu.org/software/gdb/ objective-c
GDB适用的编程语言: Ada / C / C++ / objective-c / Pascal 等。shell
GDB的工做方式: 本地调试和远程调试。编程
目前release的最新版本为8.0,GDB能够运行在Linux 和Windows 操做系统上。编程语言
(1)GDB【gnu debuger】是GNU 开源组织发布的一个强大的UNIX 下的程序调试工具。工具
(2)可以跟踪程序的执行【execute】,观察程序运行时内部的状态;当程序崩溃时【crashed】,查看程序崩溃前的状态。ui
(1)自定义程序的启动方式(指定影响程序运行时的参数)spa
(2)设置断点操作系统
(3)回溯检查致使程序异常结束的缘由 【core dump】命令行
(4)动态改变程序执行流 【能够跳过一些代码以此定位出问题的地方】
(1)软件不是一次性开发完成的,在软件开发的任何阶段都有可能存在bug
(2)调试是软件开发中不可或缺的技术,调试工具对于软件开发很重要
GDB是动态分析工具,binutils工具集是静态分析工具。
gdb的启动方式有3种,这3种方式分别适用不一样的场合下。
这种方式是在GDB内操做可执行程序,能够在shell命令行输入gdb <program> 或者进入gdb后输入file <program>
当程序执行发生异常时,会发生核心转储(core dump),产生core文件。能够使用gdb对core文件进行分析,定位问题所在的文件代码行。
gdb能够动态的链接到一个进程上,使用以前使用 ps -aux 查看想要链接的进程的PID号。
使用 quit / q / crtl +d 退出gdb。
【Tips】 使用GDB前须要完成的工做
(1)在编译C/C++源码时,须要添加 -g 选项,将调试信息添加到可执行文件中,供gdb使用
(2)Linux下默认是不产生core文件的,要使用 umilit -c unlimited 命令进行设置,这样才能产生供gdb使用的core文件
程序断点就是指处理器指令断点,通俗的解释就是:当程序运行到某个地方时,咱们但愿程序停下来,即程序“断了”!停下来的目的,就是让程序员检查当前程序运行的状态。对于软件开发人员来讲,程序断点是调试程序的必须手段,在嵌入式软件开发中,对程序断点进行了区分:软件程序断点和硬件程序断点。
原理:处理器在运行程序的过程当中,若是遇到一条非法的指令就会产生一个异常中断,程序就会停下来。软件程序断点就是利用这个特性来实现的,当咱们设置了一个断点后,调试工具就在断点的位置放置一条非法的指令,同时将被替换的指令保留起来。当程序运行到了被非法指令替换的地方时,处理器所产生的异常中断一方面在中断服务程序中恢复被替换的指令,另外一方面将控制权交给调试工具。从理论上说,软件程序断点能够设置n个,n的大小由内存容量决定。
在介绍硬件程序断点时,咱们先要问一问,为何要引入硬件程序断点。引入一种新的概念,每每意味着老的概念存在必定的局限性。那软件程序断点存在什么局限性呢?想一想看,在嵌入式系统中,若是咱们想调试一个boot loader(参见《什么是boot loader》一文),而此时处理器还在运行位于FLASH中的程序,此时软件程序断点这种方法还有效吗?固然不行,由于FLASH中的内容并不能像内存同样,被处理器经过一个写操做直接更改。在FLASH中更改内容(或称对FLASH进行编程)存在必定的协议,而显然处理器不会去实现这一协议的,这会严重影响处理器的通用性。此外,即便实现了,其效率也不会高。即然这样,软件程序断点不能运用到boot loader的调试中去。解决方法时什么呢?就是处理器提供必定的寄存器用于存放程序的断点位置,当咱们经过调试工具设置断点时,调试程序会将所需中断的指令地址放入处处理器的程序中断寄存器中。显然,处理器的这种寄存器是有限的,所以,咱们不能设置n个。
原理:
【参考资料】
[1] 程序断点与数据段点 http://yunli.blog.51cto.com/831344/196353/
[2] ff