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. Laravel 中使用 JWT 认证的 Restful API

    Laravel 中使用 JWT 认证的 Restful API 5天前/  678 /  3 / 更新于 3天前     在此文章中,我们将学习如何使用 JWT 身份验证在 Laravel 中构建 r ...

  2. JSON.parse()和eval()的区别

    json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢? JSON.parse()之可以解析json格式的数据,并且会对要解析 ...

  3. 修改oracle的字符集操作方法

    cmd环境下进行以下命令行的操作--连接sqlplus / as sysdba--命令行shutdown immediate; startup mount ALTER SYSTEM ENABLE RE ...

  4. 1179: 零起点学算法86——小明A+B(未弄懂)

    1179: 零起点学算法86——小明A+B Time Limit: 1 Sec  Memory Limit: 32 MB   64bit IO Format: %lldSubmitted: 2540  ...

  5. java -相关技术

    地址:      http://www.codeyyy.com/java/11-35-52.html

  6. 【Selenium】【BugList8】126邮箱定位不到“退出”按钮:Message: TypeError: can't access dead object

    [流程描述] 登录126邮箱,退出 [代码] #coding=utf-8 from selenium import webdriver driver = webdriver.Firefox() #dr ...

  7. C/C++中volatile关键字详解

    1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.这是 BS 在 "The ...

  8. 第四范式涂威威:AutoML技术现状与未来展望

    以下内容是对AutoML技术现状与未来展望讲座的总结. 1.机器学习定义 <西瓜书>中的直观定义是:利用经验来改善系统的性能.(这里的经验一般是指数据) Mitchell在<Mach ...

  9. 强联通分量-tarjan算法

    定义:在一张有向图中,两个点可以相互到达,则称这两个点强连通:一张有向图上任意两个点可以相互到达,则称这张图为强连通图:非强连通图有极大的强连通子图,成为强联通分量. 如图,{1},{6}分别是一个强 ...

  10. java+phantomjs实现动态网页抓取

    1.下载地址:http://phantomjs.org/download.html 2.java代码 public void getHtml(String url) { HTML="&quo ...