概述:GDB是linux下调试程序的神器,做为linux程序员,如果不能熟练的使用GDB进行程序调试,那将是很失败的事情。强大的功能使GDB的使用也变得比较复杂,如果是初学者肯定会比繁杂的命令吓到。下面是整理的一些我认为会比较有帮助的部分。下文中以">"开头的命令是linux的shell命令,以"(GDB)"开头的则是GDB内部命令。

0.转储功能(core dump):

(1).开启转储功能:首先用 >ulimit -c 查看是否开启转储功能,如果命令返回不是0则已经开启,否则就是未开启。>ulimit -c unlimited 命令可以开启转储功能。也可以用 >ulimit -c 1024来设定转储文件的大小。
(2).设定转储文件生成地址:编辑/etc/sysctl.conf文件,在文件最后加入下列两行:
kernel.core_pattern = /var/core/%t-%e-%p.core
kernel.core_uses_pid = 0
然后将文件保存起来,保存完成之后执行:>sysctl -p命令(注意:执行这个命令需要root权限。)。此时执行一个会当机的程序,会在/var/core/文件夹下面生成转储文件(例如:1432378356-a.out-4821.core)。上面设定的文件名是有固定格式的,core_pattern中设定的就是文件保存目录和文件的名字格式。其中%t是转储时的unix时间戳,%e是当前执行的文件名,%p是crash进程的PID。格式符说明如下:
格式符号
说明
%%
%字符本身
%p
被转储进程的进程ID(PID)
%u
被转储进程的真是用户ID(UID)
%g
被转储进程的真是组(GID)
%s
引发转储的信号编号
%t
转储时间,unix时间戳(从1970年1月1日0时开始的秒数)
%h
主机名
%e
可执行文件的名称
%c
转储文件的大小上限(内核版本2.6.24以后可使用)
(3).转储文件的压缩:通过在/etc/sysctl.conf文件的core_pattern中加入压缩脚本以及管道命令,可以对生成的转储文件进行压缩。首先在/etc/sysctl.conf文件中加入下列两行(如果已经存在则修改成下面的形式):
kernel.core_pattern = |/usr/localsbin/zipsh %t %e %p
kernel.core_uses_pid = 0
保存文件,然后执行:>sysctl -p命令。
/usr/local/sbin/zipsh文件的内容如下:
#!/bin/sh
exec gzip - > /var/core/$1-$2-$3.core.gz
这样的话,以后都会在/var/core下生成压缩的转储文件。
1.基本信息查看:
(1).栈信息:不管是操作转储文件还是用GDB设置断点进行调试,都可以输入(GDB)bt打印栈内容进行查看。一般的当机BUG,看下当机的位置,然后看下源代码基本就可以解决了。但是很多情况下简单的(GDB)bt还查不到问题,这时候就要涉及到比较复杂的操作。下面罗列了一些对栈的操作:
(GDB) bt:显示所有栈帧。
(GDB) bt 10:显示前面10个栈帧。
(GDB) bt -10:显示后面10个栈帧。
(GDB) bt full:显示栈帧以及局部变量。
(GDB) bt full 10:显示前面10个栈帧以及局部变量。
(GDB) bt full -10:显示后面10个栈帧以及局部变量。
(GDB) frame <栈帧编号>:进入指定的栈帧中,然后可以查看当前栈帧中的局部变量,以及栈帧内容等信息。
(GDB) info frame <栈帧编号>:可以查看指定栈帧的详细信息。
(GDB) up:进入上层栈帧。
(GDB) down:进入下层栈帧。

 (2).变量:调试BUG过程中查看变量信息是很有帮助的操作,查看方式如下:

(GDB) p <变量名>
 (3).寄存器:对于调试来说寄存器中的值也很重要,可以查看到当前正在执行的指令的地址等。具体操作罗列如下:   
(GDB) info reg:显示所有寄存器。可以简写为:i r。如果要查看具体的寄存器可以这样:i $ebx
(GDB) p $eax:显示eax寄存器内容。
(GDB) p/c $eax:用字符显示eax寄存器内容,反斜杠后面的是显示格式,可使用的格式见下表:该表在显示内存内容的x命令中也是通用的。

格式
说明
x
显示为十六进制数
d
显示为十进制数
u
显示为无符号十进制数
o
显示为八进制数
t
显示为二进制数
a
显示为地址
c
显示为字符(ASCII)
f
显示为浮点小数
s
显示为字符串
i
显示为机器语言(仅在显示内存的x命令中可用)
(4).内存:可以查看具体内存地址中的内容,比如:目前执行的汇编指令,以及栈中内容等。
(GDB) x $pc:显示程序指针指向位置的内容。
(GDB) x/i $pc:显示程序当前位置的汇编指令。
(GDB) x/10i $pc:显示程序当前位置开始往后的10条汇编指令。
(GDB) disassem $pc:反汇编当前函数。简写为:disas $pc。

2.调试:
 (1).断点:调试程序中,设置断点进行调试是最方便有效的手段,因此学会如果灵活设置断点是调试的基本功。:
 A.设置断点:
(GDB) break <函数名>:对当前正在执行的文件中的指定函数设置断点。可简写为:(GDB) b <函数名>
(GDB) break <行号>:对当前正在执行的文件中的特定行设置断点。可简写为:(GDB) b <行号>
(GDB) break <文件名:行号>:对指定文件的指定行设置断点。最常用的设置断点方式。可简写为:(GDB) b <文件名:行号>
(GDB) break <文件名:函数名>:对指定文件的指定函数设置断点。C++类中的方法似乎不好使。可简写为:(GDB) b <文件名:函数名>
(GDB) break <+/-偏移量>:当前指令行+/-偏移量出设置断点。可简写为:b <+/-偏移量>
(GDB) break <*地址>:指定地址处设置断点。可简写为:b <*地址>
B.查看、删除断点:            
(GDB) info break :显示所有断点以及监视点。可简写为:(GDB) i b
(GDB) delete <编号>:删除编号指向的断点或者监视点。可简写为:(GDB) d <编号>
(GDB) clear <行号>:删除改行的断点。
(GDB) clear <文件名:行号>:删除改行的断点。

 C.设置无效、有效断点:
(GDB) disable <断点编号> : 当前断点设置为无效。
(GDB) enable <断点编号>:当前断点设置为有效。

 (2).监视点:可以监视某个变量,在变量被访问或者被修改时程序会在当前点进入断点。删除,查看监视点的方式与断点相同。设置监视点方式如下:            
(GDB) watch <表达式>:表达式发生变化时暂停。
(GDB) awatch <表达式>:表达式访问或者改变时暂停。
(GDB) rwatch <表达式>:表达式被访问时暂停。

 (3).条件断点:在调试程序过程中,有时候我们只想在某个条件下停止程序,然后进行单步调试,而条件断点就是为此而设计。下面是条件断点的操作方式:    
(GDB) b <断点> if <条件表达式> : 例如:b main.cpp:8 if x=10 && y=10
(GDB) condition <断点编号>:删除该断点的条件。
(GDB) condition <断点编号> <条件表达式>:修改断点条件。例如:condition 1 x=10 && y=10

(4).断点命令:每次断点发生时候,想要查看的变量很多时,如果每个变量都手动print则需要浪费很多时间。断点命令可以在断点发生时批量执行GDB命令。下面是断点命令的设置方式:
(GDB) commands <断点编号>

(GDB) >print x
(GDB) >print y
(GDB) >end
首先输入GDB命令commands <断点编号>然后回车,这时候会出现>提示符。出现>提示符后可以输入断点发生时需要执行的GDB命令,每行一条,全部输入完成后输入end结束断点命令。

 (5).反复执行:单步执行时如果进入了你不关心的函数,你想立即跳出函数;或者进入了大循环中,你想立即循环。下面的命令可以帮到你:    
(GDB) ignore <断点编号> <次数>:忽略N次断点。
(GDB) c N: 执行N次指令,会忽略断点。
(GDB) s/stepi/n/nexti N:往后执行N行,不会忽略断点。
(GDB) finish:执行完当前函数后停止,不会忽略断点。
(GDB) until:执行完当前循环后停止,不会忽略断点。
(GDB) until <地址>:执行到指定地址停止。

(6).设置变量值:对变量的值进行控制,可以更快的调试自己的程序。下面就是设置变量值的方法:
(GDB) set variable <变量> = <表达式>:将变量的值设定为指定表达式的值。例如 set variable x=10
 (7).手动生成转储文件:
(GDB) generate-core-file 简写为:(GDB) gcore
3.调试在线进程:
(1).启动GDB时链接目标进程:在启动GDB的时候,通过参数-p指定目标进程,就可以进入调试状态。刚链接成功后,程序是暂停运行状态,你可以进行设置断点等操作,然后输入(GDB) c 命令继续运行。命令如下:
>gdb -p <PID>:PID是进程ID,可以通过>ps aux | grep <程序名> 获得。或者直接 >gdb -p  `pidof <程序名>`也可以。>pidof <程序名>是通过名字获取进程ID的命令。
(2).GDB中链接目标进程:
(GDB) attach <PID>
 (3).断开链接:
(GDB) detach
4.调试多线程程序:
 (1).查看线程:
(GDB) info thread:查看所有线程信息,可简写为:i thr
 (2).切换到指定线程:
(GDB) thread <线程编号>:选中出现问题的线程,可简写为:thr <线程编号>
(3).调试守护者进程:守护者进程在启动好子进程后,会自动关闭主进程,如果没有设定监控模式的话,GDB会提示断开与进程的链接。所以必须设定监控对象,设置方式如下:
(GDB) set follow-fork-mode child/parent

GDB调试器使用总结相关推荐

  1. GDB调试器使用手册

    GDB调试器使用手册     使用GDB:     本文描述GDB,GNU的原代码调试器.(这是4.12版1994年一月,GDB版本4.16) * 目录: * 摘要:                  ...

  2. Linux调试——gdb调试器的简单使用调试coredump文件

    文章目录 一.背景 二.gdb的指令与使用 1.gdb的基本指令. 2.gdb指令的简单使用 1.进入gdb模式 2.实例说明 三.调试coredump文件 前提:本质上是在调试程序崩溃之后的内存镜像 ...

  3. GCC编译器和GDB调试器常用选项

    GCC编译器 gcc hello.c -o hello                   #将hello.c编译成hello可执行文件 gcc -E hello.c -o hello.i       ...

  4. [转载].gdb调试器快速入门

    调试在我们编写程序时占有重要的地位.在linux下如何使用gdb调试器?下面采用FQA的方式让你快速了解gdb调试器. 1.如何启动gdb调试器呢? 在终端输入 gdb 程序文件名 即可.注意gdb调 ...

  5. 【Linux学习】GDB调试器基本命令必知必会(一)

    本文介绍Linux下GDB调试器常用的基本命令. 测试均在Ubuntu12.10下完成. 先看看GDB调试的效果图: 对应的源代码: //插入排序,GDB调试测试代码 #include <std ...

  6. linux卸载gdb命令,【Linux学习】GDB调试器基本命令必知必会(一)

    本文介绍Linux下GDB调试器常用的基本命令. 测试均在Ubuntu12.10下完成. 先看看GDB调试的效果图: 对应的源代码: //插入排序,GDB调试测试代码 #include int x[1 ...

  7. ROS机器人程序设计(原书第2版)3.1.2 ROS节点启动时调用gdb调试器

    3.1.2 ROS节点启动时调用gdb调试器 我们需要一个启动文件(launch)去启动节点,如下: 想要在节点启动时调用gdb调试器,需要添加launch-prefix="xterm -e ...

  8. Vim GDB 调试器编译配置说明

    2019独角兽企业重金招聘Python工程师标准>>> <hr> 首先,对之前提到vim环境下中文字符显示乱码的问题作出一个补充.<br> 本人的Redhat ...

  9. 使用GDB调试器(一)

    使用GDB调试器 GDB概要 ---- GDB是GNU开源组织公布的一个强大的UNIX下的程序调试工具.也许,各位比較喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但假设你是在UNIX平台下做 ...

  10. GDB调试器源代码分析系列--Inferior call的实现与分析(1)

    [转] GDB调试器源代码分析系列--Inferior call的实现与分析(1) (2011-10-11 20:41) 标签: 分析 分类: 调试器 先说说几个概念: (1)     什么是infe ...

最新文章

  1. dart 语言是jvm_Dart编译技术在服务端的探索和应用
  2. python爬虫赚钱的经历-十年真ㆍPython大佬用爬虫赚钱的自述!看完学到了!
  3. Java算法之 选择排序
  4. flash 多张相片同时移动_Flash时代时代即将终止?早就预料到了
  5. 在单节点和多节点上的Hadoop设置
  6. JavaScript 中数组方法 reduce 的妙用之处
  7. CMD不能显示中文解决方案
  8. mysql内部参数是什么意思_mysql参数及解释
  9. 开源 免费 java CMS - FreeCMS1.5 标签 visit
  10. elasticsearch使用Filter过滤查询操作(使用marvel插件)
  11. 基于表征(Representation)的文本匹配、信息检索、向量召回的方法总结
  12. 设计模式 -(1)简单工厂模式(创建型)
  13. 51单片机流水灯用c语言,51单片机流水灯C语言源代码.doc
  14. 电商商品中心类目体系
  15. felix 与Phoenix 发音 n和l的分辨
  16. 基于百度指数的股票收益率多因子模型研究
  17. Nginx安装及详细配置
  18. 尝试Ping百度域名后的思考
  19. SpringBoot项目——————签到与签退管理(源码分享)
  20. 学校计算机机房 管理 总结,学校计算机机房的建设与管理

热门文章

  1. Substring with Concatenation of All Words
  2. 文件管理详细知识要点
  3. VC菜菜鸟-创建一个即时串口通信程序
  4. C#统计一段时间内有多少个星期几
  5. python培训出来的有公司要吗-参加Python培训后真的能找到工作吗?上海Python培训...
  6. 以下选项不是python文件读操作的是-以下选项中,不是Python中文件操作的相关函数是()...
  7. python怎么读取txt文件数据保存数组中-Python Numpy中数据的常用的保存与读取方法...
  8. python绘制灰度图片直方图-python数字图像处理(9):直方图与均衡化
  9. python手机版下载3.7.2-Python3.5.2
  10. python自学视频教程-28岁想从零开始自学python,有哪些靠谱免费的视频?