GDB调试器使用总结

概述: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

时间: 2024-10-05 06:46:59

GDB调试器使用总结的相关文章

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

http://blog.csdn.net/u014328976/article/details/46745349 GCC编译器 gcc hello.c -o hello                   #将hello.c编译成hello可执行文件 gcc -E hello.c -o hello.i              #将hello.c 转换成预处理后的文件hello.igcc -S hello.c -o hello.S              #将hello.c 转换成汇编文件 h

linux基础2——gdb调试器

gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功: 4." l " (小写l)命令可以查看当前代码是否是要执行的代码: 5.断点 b 行号/函数名字——作用是程序执行过程中会自动在断点处暂停,等待指令 info b—— 查看断点列表 d 编号——删除指定编号的断点 6.执行程序 r 回车——程序启动,执行到代码中第一个出现断点处暂停 7

使用GDB调试器(一)

使用GDB调试器 GDB概要---- GDB是GNU开源组织公布的一个强大的UNIX下的程序调试工具.也许,各位比較喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但假设你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓"寸有所长.尺有所短"就是这个道理. 一般来说.GDB主要帮忙你完毕以下四个方面的功能: 1.启动你的程序,能够依照你的自己定义的要求随心所欲的执行程序.    2.可让被调试的程序在你所指定的调置的断点处停住.

GDB调试器的使用

http://blog.chinaunix.net/uid-23193900-id-3184605.html 1.什么是程序的调试? 程序调试的目的就是找出程序中隐藏的故障,校正那些不正常的指令,使程序能够正常工作. 2.调试的类别 程序的调试有几种不同的级别.最高级别当然是编程人员通过自己肉眼观察和推断,找出那些有毛病的代码并修改之.最低级别是对汇编代码进行调试.由于汇编语言代码的复杂.冗长与不直观.在汇编级对程序进行调试是一件比较费力的事. 使用得最多的大概还是源程序级即符号级的调试,在此种

Linux gdb调试器用法全面解析

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序. 让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式. 当程序被停住时,可以检查此时程序中所发生的事,并追索上文. 动态地改变程序的执行环境. 不管是调试Linux内核空间的驱动还是调试用户空间的应用程序,掌握gdb的用法都是必须.而且,调试内核和调试应用程序时使用的gdb命令是完全相同的,下面以代码清单22.2的应用程

GDB 调试器使用手冊

使用GDB: 本文描写叙述GDB,GNU的原代码调试器. (这是4.12版1994年一月.GDB版本号4.16) * 文件夹: * 摘要: GDB的摘要 * 实例: 一个使用实例 * 入门: 进入和退出GDB * 命令: GDB 的命令 * 运行: 在GDB下运行程序 * 停止: 暂停和继续运行 * 栈: 检查堆栈 * 原文件: 检查原文件 * 数据: 检查数据 * 语言: 用不同的语言来使用GDB * 符号: 检查符号表 * 更改: 更改运行 * GDB的文件 文件 * 对象 指定调试对象 *

@清晰掉 GDB调试器中的战斗机

GDB 的命令很多,本文不会全部介绍,仅会介绍一些最常用的.在介绍之前,先介绍GDB中的一个非常有用的功能:补齐功能.它就如同Linux下SHELL中的命令补齐一样.当你输入一个命令的前几个字符,然后输入TAB键,如果没有其它命令的前几个字符与此相同,SHELL将补齐此命令.如果有其它命令的前几个字符与此相同,你会听到一声警告声,再输入TAB键,SHELL将所有前几个字符与此相同的命令全部列出.而GDB中的补齐功能不仅能补齐GDB命令,而且能补齐参数. 本文将先介绍常用的命令,然后结合一个具体的

GDB 调试器使用手册

使用GDB: 本文描述GDB,GNU的原代码调试器.(这是4.12版1994年一月,GDB版本4.16) * 目录: * 摘要: GDB的摘要 * 实例: 一个使用实例 * 入门: 进入和退出GDB * 命令: GDB 的命令 * 运行: 在GDB下运行程序 * 停止: 暂停和继续执行 * 栈: 检查堆栈 * 原文件: 检查原文件 * 数据: 检查数据 * 语言: 用不同的语言来使用GDB * 符号: 检查符号表 * 更改: 更改执行 * GDB的文件 文件 * 对象 指定调试对象 * 控制GD

Window下 Qt Creator 安装+Qt4.8.5+MinGW编译器+GDB调试器

为了便于与嵌入式linux系统的QT编译环境系统相匹配,我们使用了QT4.8.5的编译环境.你也可以使用其他版本的软件,QT4大致的安装步骤都是一样的,可以参考. 本搭建环境在window 32/64皆可使用.有以下四个文件,可以在网上直接搜到,这里就不提供下载地址了. 如图所示共有四个文件 其中两个exe文件是需要安装的. 安装步骤如下: 1) 将两个压缩文件直接解压到当前文件夹,MinGW-gcc440_1.zip , qtcreator-gdb-7.4-MINGW32_NT-6.1-i68

工具篇之GDB调试器用法

GDB 完成的作用: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序 让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式 当程序被停住时,可以检查此时程序中所发生的事,并追索上文 动态改变程序的运行环境 常见问题: 如何打印变量的值?(print var) 如何打印变量的地址?(print &var) 如何打印地址的数据值?(print *address) 如何查看当前运行的文件和行?(backtrace) 如何查看指定文件的代码?(list file:N) 如何立即执行完当前