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. g++ 学习笔记

    gcc and g++分别是GNU的c & c++编译器.gcc/g++在执行编译的时候一般有下面4步: 1 预处理,生成.i的文件. 命令如下:g++ -E  test.cpp 此命令只进行 ...

  2. 【转】为什么分布式一定要有Redis?

    发现一篇好文. https://studygolang.com/articles/15064

  3. [模拟][NOIP2015]神奇的幻方

    神奇的幻方 题目描述 幻方是一种很神奇的N∗ N矩阵:它由数字 1,2,3, … … , N ∗ N 构成,且每行.每列及两条对角线上的数字之和都相同. 当 N为奇数时,我们可以通过以下方法构建一个幻 ...

  4. day 8:open文件和with的使用

    本节内容: 1,open打开文件后的几种操作 2,with和open的连用 3,flush的使用 1:open 1)r权限 f = open("D:\\auto\project\\fulls ...

  5. filebeat 收集的进度日志查看

    filebeat 收集的日志进度和文件在data 目录中是有保存的 默认路径地址: /usr/share/filebeat/data 里面有两个文件: meta.json:{"uuid&qu ...

  6. hbase_存储模型

    Hbase 是按列存储,所以每个列族存储在一个HDFS文件上. Hbase表中的行是按照rowkey字典序进行排列的,并且表格在行的方向上被分割为多个region(按照行进行分割的) region 是 ...

  7. 微信小程序的一些小知识点

    1. <text>hello</text> 只有包含在<text>标签内的文字,在手机上才可以长按选中. 2. 单位px:自适应rpx = 1:1 物理像素除以2得 ...

  8. 别人的Linux私房菜(14)Linux账号管理和ACL权限设置

    用户标识符UID.GID 用户的账号信息,主要是指UID对应.组和GID对应 检查系统中是否存在用户bin:id bin 登录shell验证账号密码的步骤:找到/etc/passwd核对是否存在账号, ...

  9. IDEA springboot 项目静态文件修改不更新的问题

    springboot 项目的页面和静态文件,在项目启动后,修改无效.按照下面的配置可以解决问题. 1.file-setting 勾选项目自动构建 2.使用快捷键 ctrl+ shift+ alt + ...

  10. vs C++ scanf 不安全

    项目->属性-> c/c++->预处理器->预处理器定义->加入下面这句: _CRT_SECURE_NO_DEPRECATE