GDB, The GNU Project debugger, allows you to see what is going on inside another program while it executes – or what another program was doing at the moment it crashed.

GDB 主要完成以下四件事:

  1. 启动程序,指定影响程序运行的条件。
  2. 使程序在特定的条件下停止。
  3. 程序停止时,检查程序锁发生的事。
  4. 动态的改变程序的执行环境。

前期准备

GDB 一般用于调试C/C++程序,要想能够使用GDB调试C/C++程序,首先必须将调试信息添加到可执行程序中。使用gcc/g++-g参数可以做到这一点。如:

1
gcc -g programe.c -o programe

此时,可执行程序programe中就包含了调试需要的各种信息,如程序函数名、变量名等。 对于 MAC OSX 系统,调试信息会包含在另外一个programe.dSYM(debug symbols)文件夹下面,可以使用dwarfdump programe.dSYM直接查看各符号信息。

启动GDB方法

  1. gdb program就是执行的文件,一般在当前目录下。
  2. gdb core 用GDB同事调试一个运行程序和 core 文件,core 是程序非法执行后 core dump 后产生的文件。
  3. gdb 如果程序是一个服务程序,则可以指定服务程序运行时的进程ID。gdb 自动 attach 上去,并调试它。 program 应该在 PATH 环境变量中搜索得到。

如果出现Segment Fault,可以通过方法 2 来进行 Debug 程序,启动方式为gdb {executable} {dump file},如果没有产生 core 文件,需要在执行 executable 之前先执行如下命令:

1
$ulimit -c unlimited

设置运行参数

set args 可指定运行时参数。(如:set args 10 20 30) 
show args 命令可以查看设置好的运行参数。

查看源码

1
2
list linenum  //查看linenum行的源码
list function //查看function的源码

断点break 使用

设置断点的方法

1
2
3
4
5
break linenum  //在 linenum 处设置断点
break function //在进入指定 function 时停住
break filename:linenum //在源文件 filename 的 linenum 行处停住
break filename:function //在源文件 filename 的 function 函数的入口处停住
break *address //在程序运行的内存地址处停住

查看断点信息

1
2
info break    //查看所有 break 的信息
info break n //查看 n 断点号的信息

运行程序

运行程序如下

1
2
next //单步执行
continue //继续执行程序,直到程序结束或遇到下一个断点

查看运行时数据

1
2
print parm //打印变量parm的值
bt //查看函数堆栈信息

当运行程序到某个位置时,我们希望看看此时程序的状态,比如某个变量的值是否按照预期改变、某块内存的值是否被改。此时就需要用到查看程序运行数据的集中方法。

查看格式 print <expr>print /<f> <expr>,其中<expr>是要查看的表达式,可以是一个变量、数组、表达式等,<f>是输出时的格式,比如想要按照 16 进制输出,就使用/x

可以使用 examine 命令查看内存地址中的值。格式是x /<n/f/u> <addr>,其中<addr>是内存地址。

查看内存数据

在调试代码时,经常需要查看某块内存的数据,此时就需要使用GDB中的Examining memory
可以使用命令x(即examine)来检查任意格式的内存数据,不管你的程序数据类型。使用的格式为:

1
2
x  /nfu addr
x addr

其中n/f/u 是选项参数,指定内存的大小及显示格式;addr 指定显示的内存的起始地址。n 是十进制的整数,指定小时内存的大小;f 指定显示的格式,它的使用与 GDB 中的 print 使用的格式一样,如x指定使用 16 进制显示, d按十进制格式显示等;u 是指每个显示单元的大小,如b是指每个显示单元为 byte,h是指每个显示单元为半字(两个 byte)等;addr 指定要显示的内存的起始地址。

如果需要查看的数据比较多,比如我们需要 dump 一块 buffer 的数据,与特定的数据进行比较,上面提到的examine就很难实现了。此时需要将块内存 dump 出来。使用到的命令是 dumpappendrestore。此处主要介绍dump命令。
它的格式为:

1
dump [format] memory filename start_addr end_addr

从格式可以看出,它的含义是从start_addr开始到end_addr结束的 memory dump 到 指定的文件 filename 中。

分割窗口

layout 用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法:

  • layout src:显示源代码窗口
  • layout asm:显示汇编窗口
  • layout regs:显示源代码汇编和寄存器窗口
  • layout split:显示源代码和汇编窗口
  • layout next:显示下一个 layout
  • layout prev:显示上一个 layout
  • Ctrl+L:刷新窗口
  • Ctrl+x,再按1:单窗口模式,显示一个窗口
  • Ctrl+x,再按2:双窗口模式,显示两个窗口
  • Ctrl+x,再按a:回到传统模式,即退出 layout, 回到执行 layout 之前的调试窗口

问题汇总

  1. 在工作中经常遇到把编译处的.o.bin可执行文件,拿到别的路径下运行、Debug,经常遇到GDB找不到debug src info的情况,此时可以通过directory命令指定寻找的路径。

参考文献

  1. GNU Debugger Tutorial
  2. GDB: The GNU Project Debugger
  3. GNU Debugger
  4. How to Debug Using GDB
  5. Debugging with GDB
  6. 用GDB调试程序
  7. Debugging with GDB: The GNU Source-Level Debugger
  8. GDB Pocket Reference: Debugging Quickly & Painlessly with GDB
  9. The Art of Debugging with GDB, DDD, and Eclipse

如何使用 GDB的更多相关文章

  1. linux应用调试技术之GDB和GDBServer

    1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...

  2. 新手如何在gdb中存活

    网络上已经有很多gdb调试的文章了,为什么我还要写这篇文章呢,因为本文是写给gdb新手的,目的就是通过一个简单的例子来让新手很快上手.一旦上手入门了,其他的问题就可以自己去搜索搞定了.右边是gdb的L ...

  3. GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断

    多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序freeze,直到你continue这个线程,程 ...

  4. GDB调试命令

    1.查看源码: list [函数名][行数] 2.暂停程序 (1)设置断点: a.break + [源代码行号][源代码函数名][内存地址] b.break ... if condition   .. ...

  5. 关于gdb和shp的FID问题

    gdb的FID从1开始,并且FID唯一,从数字化时开始,每个图形对应唯一的FID,删除图形亦删除对应的FID.FID可能出现中断的情况. shp的FID从0开始,并且永远连续.删除图形,则编号在其下面 ...

  6. GDB调试命令小结

    1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ...

  7. gdb 基本知识

    一 单步执行和跟踪函数调用 先给出一段代码,可以用下面介绍的例子. #include <stdio.h> int add_range(int low, int high) { int i, ...

  8. GDB 完全教程

    一.简介 GDB是一个功能强大的调试器,它是一个自由软件,能够用在许多UNIX平台上.它同时也是Linux系统中的默认调试器.GDB已被移植到许多其他的计算机平台上,并且能够用于调试嵌入式实时系统.一 ...

  9. GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...

  10. gdb可以调试python的pdb么

    1.如题: gdb可以调试python的pdb么? 答案:可以,实验如下. 2.实验: 生成一个a.py代码文件,代码如下: import pdb a = 1 print "111" ...

随机推荐

  1. SQL Server数据库的兼容级别

    SQL Server 是Microsoft 公司推出的关系型数据库管理系统.具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行M ...

  2. POS VB

    PPSM06S70:  Add  moddate EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, 'yyyy/mm/dd/HH24:MI AM')) ACTUAL_ ...

  3. 2017沈阳站 Tree

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6228 Tree Time Limit: 2000/1000 MS (Java/Others)    M ...

  4. ssh 免密登录阿里云主机

    在网上找了好几篇教程,都不好使. 终于在这篇找到了答案 解决方案: 在 sshd_config 里面将这一项: AuthorizedKeysFile .ssh/authorized_keys 被我修改 ...

  5. JavaScript变量声明var,let.const

    var声明变量的作用域限制在其声明位置的上下文中 var x = 0; // x是全局变量,并且赋值为0. console.log(typeof z); // undefined,因为z还不存在. f ...

  6. RAM和ROM

    RAM:随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器.[1]它可以随时读写(刷新时除外,见下文),而且速度很快,通常作为 ...

  7. 87、代码适配IphoneX

    一.APP在iphoneX运行后不能占满,上下都有多余的边 解决方法:把旧的image.xcassets中的LaunchImage删掉,重新创建并在Images.xcassets中为iPhone X添 ...

  8. 【翻译】Flume 1.8.0 User Guide(用户指南) source

    翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...

  9. JSOI2018 简要题解

    潜入行动 复杂度分析题. 定义状态fi,j,0/1,0/1f_{i,j,0/1,0/1}fi,j,0/1,0/1​表示以iii为根子树放jjj个机器iii这个放不放,iii这个是否已放来进行dpdpd ...

  10. 关于echarts生成雷达图的一些参数介绍

    export const industryFactorOption = { title: { text: '雷达图', textStyle: { color: 'rgba(221,221,221,1) ...