GDB使用小记

By francis_hao Nov 7,2016

 

记录GDB常用功能。

 

GDB可以让你查看一个程序在运行时其内部发生了什么,或者当一个程序崩溃时发生了什么(通过使用GDB查看core dump文件)

 

基础

 

启动GDB

gdb            仅启动GDB,未加载程序文件,可通过file program进行加载,也可以在启动时添加-q选项,不输出版本信息

gdb program        启动GDB并加载程序文件

gdb program core    启动GDB加载程序文件和核心文件(查看core dump??)

gdb program <PID>    调试pid为<PID>的已运行进程,注意,如果目录下有与<PID>同名的文件,则会先检查此文件。

list [file:]function

从当前程序停止的位置查看程序源码,直接打印到屏幕上。

break (b)

break [LOCATION] [thread THREADNUM] [if CONDITION]

LOCATION:

    行号

    函数名

    文件名:行号

    文件名:函数号

    *地址

    +偏移量

    -偏移量

    如果没有指定LOCATION,则会在当前执行地址设置断点

THREADNUM:可以从info threads中获取

CONDITION :条件,例如i==5,仅当i=5时break。

info (i)

info line        当前调试位置的程序的地址

info locals        当前堆栈下的局部变量

info macro xx        显示宏xx的值

info program        程序当前的执行状态

info registers        列出整形寄存器和值

info set            显示GDB所有的设置(内容较多)

info sharedlibrary    显示加载的共享库的状态

info source        当前源文件的信息

info sources        程序里的源文件信息

info stack        程序堆栈的回溯信息(类似backtrace)

info target        当前被调试文件的一些信息(可以看到ELF各个段)

info threads        当前已知的线程信息

info tracepoints    追踪点的状态(how to use)

info types        显示所有定义的数据类型(例如你定义的uchar的实际类型)

info variables        所有全局的和静态的变量信息

disable

失能断点,后面可以加断点号,若不加则全部失能

enable

使能断点,后面可以加断点号,若不加则全部使能

delete (d)

删除断点,后面可以加断点号,若不加则全部删除

run [arglist]

启动程序,同时指定程序的参数

next (n)

单步运行,如果有函数,一步执行,不进入

step (s)

单步运行,如果有函数则进入,单步执行最小语句单位

continue (c)

继续运行,遇到断点或结束才停止

print i (p i)

打印变量i的值

有效的变量包括当前栈的局部变量和全局变量,

还有一种形式可以打印一个连续内存的值,常用语数组中,这种形式就是FOO@NUM其中FOO是一个数组中的元素(注意,不是指针),NUM是要显示的个数。同时,print命令也支持x命令的FMT,但是省略了重复数和单位长度,因为NUM指出了重复数,而FOO指示了数据类型,也就知道了单位长度

例如:

p /u *name@10

其中name是一个数组

edit [file:]function

从当前程序停止的位置查看程序源码,默认是行模式,可以输入vi进入类似vi的模式

set print element 0

改变显示字符串的个数限制,从而显示所有的字符串

backtrace (bt)|where

查看当前函数调用栈的所有信息,后面可跟数字表示只打印栈顶n层的信息

up

用于bt后,跳到上一函数栈,以查看上一函数栈的信息

down

用于bt后,跳到下一函数栈,以查看下一函数栈的信息

finish

退出当前函数,可返回调用它的上一层函数

q

退出gdb调试

disassemble

对当前函数对应的二进制进行反汇编

thread <ID>

切换当前调试的线程为指定ID的线程

gdb -p <PID>

调试指定ID的进程,GDB可以调试已经运行的程序。

或者在进入GDB之后输入:attach <PID>

 

进阶

 

examine (x)

x/FMT ADDRESS

查看内存

ADDRESS是一个要查看的内存地址表达式,

FMT 是 重复数+格式+单位长度的组合。

格式由一个字母表示的,可取值有:o(八进制),x(十六进制),d(十进制),u(无符号十进制),t(二进制),f(浮点数),a(地址),i(指令),c(字符)和s(字符串)。

单位长度有:b(一字节byte),h(二字节halfword),w(四字节word),g(八字节giant)。

比如x/2xw,表示以十六进制显示两个四字节大小的内存数据

默认的格式和单位长度是上次使用的值,默认的重复数是1,默认的地址是接着上次使用该命令或print命令的地址。

 

 


本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:http://www.cnblogs.com/yinghao1991/p/6041147.html

 

 

参考

 

【1】 gdb_tips : http://gitlore.com/gitlore-git/gdb_tips/index.html

【2】 用GDB调试程序http://blog.csdn.net/yasi_xi/article/details/12784507

【3】 GDB backtrace bt 查看程序crash堆栈信息 http://blog.csdn.net/jzp12/article/details/7860706

【4】 用GDB调试程序—调试器GDB常用功能 http://daimajishu.iteye.com/blog/1089741

【5】 GDB的基本用法 http://blog.csdn.net/bolike/article/details/8799156

【6】 gdb设置条件断点 http://blog.csdn.net/yasi_xi/article/details/8687452

原文地址:https://www.cnblogs.com/yinghao-liu/p/6041147.html