您的位置:首页 > 其它

gdb经常使用命令总结

2016-01-17 09:23 309 查看
1: 对于在应用程序中增加參数进行调试的方法:

直接用 gdb app -p1 -p2 这样进行调试是不行的。

须要像下面这样使用:

#gdb app

(gdb) r -p1 -p2

或者在执行run命令前使用set args命令:

(gdb) set args p1 p2

能够用show args 命令来查看

2. 增加断点:

break <linenumber>

break <funcName>

break +offset

break -offset

(在当前行号的前面或后面的offset行停住。)

break filename:linenum

在源文件filename的linenum行处停住。

break filename:function

在源文件filename的function函数的入口处停住。

break ... if

...能够是上述的參数。condition表示条件。在条件成立时停住。比方在循环境体中,能够设置 break if i=100,表示当i为100时停住程序。

3. 查看执行时的堆栈:

使用bt命令

4. 打印某个变量的值:

print val

5. 单步: n

继续执行: c

  step

  单步跟踪,假设有函数调用,他会进入该函数。

  next

  相同单步跟踪。假设有函数调用,他不会进入该函数。非常像VC等工具中的step over。后面能够加count也能够不加,不加表示一条条地运行,加表示运行后面的count条指令,然后再停住。

  set step-mode

  set step-mode on

  打开step-mode模式,于是,在进行单步跟踪时,程序不会由于没有debug信息而不停住。这个參数有非常利于查看机器码。

  set step-mod off

  关闭step-mode模式。

  finish

  执行程序,直到当前函数完毕返回。并打印函数返回时的堆栈地址和返回值及參数值等信息。

  until 或 u

  当你厌倦了在一个循环体内单步跟踪时,这个命令能够执行程序直到退出循环体。

6.在GDB中运行shell命令:

 在gdb环境中,你能够运行UNIX的shell的命令,使用gdb的shell命令来完毕:

 eg. shell make

7. 执行环境

可设定程序的执行路径。

show paths 查看程序的执行路径。

set environment varname [=value] 环境变量设置。如:set env USER=hchen

show environment [varname] 查看环境变量。

8.观察点(WatchPoint)

观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,假设有变化。立即停住程 序。

我们有以下的几种方法来设置观察点:

watch

为表达式(变量)expr设置一个观察点。一量表达式值有变化时。立即停住程序。

rwatch

当表达式(变量)expr被读时,停住程序。

awatch

当表达式(变量)的值被读或被写时。停住程序。

info watchpoints

列出当前所设置了的全部观察点。

9. 维护breakpoint

clear

清除全部的已定义的停止点。

clear func

清除全部设置在函数上的停止点。

delete [breakpoints] [range...]

删除指定的断点,breakpoints为断点号。假设不指定断点号,则表示删除全部的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。

比删除更好的一种方法是disable停止点。disable了的停止点,GDB不会删除。当你还须要时。enable就可以,就好像回收站一样。

disable [breakpoints] [range...]

disable所指定的停止点,breakpoints为停止点号。假设什么都不指定。表示disable全部的停止 点。简写命令是dis.

enable [breakpoints] [range...]

enable所指定的停止点。breakpoints为停止点号。

10、程序变量

查看文件里某变量的值:

file::variable

function::variable

能够通过这样的形式指定你所想查看的变量,是哪个文件里的或是哪个函数中的。比如,查看文件f2.c中的全局变量x的值:

gdb) p 'f2.c'::x

查看数组的值

有时候。你须要查看一段连续的内存空间的值。比方数组的一段,或是动态分配的数据的大小。

你能够使用GDB的“@”操作符。“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。比如,你的程序中有这种语句:

int *array = (int *) malloc (len * sizeof (int));

于是。在GDB调试过程中,你能够以例如以下命令显示出这个动态数组的取值:

p *array@len

假设是静态数组的话,能够直接用print数组名。就能够显示数组中全部数据的内容了。

11.输出格式

一般来说,GDB会依据变量的类型输出变量的值。

但你也能够自己定义GDB的输出的格式。比如。你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样。你能够使用GDB的数据显示格式:

x 按十六进制格式显示变量。

d 按十进制格式显示变量。

u 按十六进制格式显示无符号整型。

o 按八进制格式显示变量。

t 按二进制格式显示变量。

a 按十六进制格式显示变量。

c 按字符格式显示变量。

f 按浮点数格式显示变量。

(gdb) p i

$21 = 101

(gdb) p/a i

$22 = 0x65

(gdb) p/c i

$23 = 101 'e'

(gdb) p/f i

$24 = 1.41531145e-43

(gdb) p/x i

$25 = 0x65

(gdb) p/t i

$26 = 1100101

11.查看内存

使用examine命令(简写是x)来查看内存地址中的值。

x命令的语法例如以下所看到的:

x/

n、f、u是可选的參数。

n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。

f 表示显示的格式,參见上面。假设地址所指的是字符串,那么格式能够是s,假设地十是指令地址,那么格式能够是i。

u 表示从当前地址往后请求的字节数。假设不指定的话。GDB默认是4个bytes。u參数能够用以下的字符来取代,b表示单字节。h表示双字节,w表示四字节。g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址開始,读写指定字节,并把其当作一个值取出来。

n/f/u三个參数能够一起使用。比如:

命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。

12.自己主动显示

你能够设置一些自己主动显示的变量。当程序停住时,或是在你单步跟踪时,这些变量会自己主动显示。相关的GDB命令是display。

display

display/

display/ expr

expr是一个表达式。fmt表示显示的格式,addr表示内存地址,当你用display设定好了一个或多个表达式后,仅仅要你的程序被停下来,GDB会自己主动显示你所设置的这些表达式的值。

格式i和s相同被display支持。一个很实用的命令是:

display/i $pc

undisplay

delete display

删除自己主动显示,dnums意为所设置好了的自己主动显式的编号。

disable display

enable display

disable和enalbe不删除自己主动显示的设置,而仅仅是让其失效和恢复。

info display

查看display设置的自己主动显示的信息。

GDB会打出一张表格。向你报告当然调试中设置了多少个自己主动显示设置。当中包含,设置的编号。表达式,是否enable。

13. 设置显示选项

set print address

set print address on

打开地址输出。当程序显示函数信息时,GDB会显出函数的參数地址。系统默觉得打开的,

show print address

查看当前地址显示选项是否打开。

set print array

set print array on

打开数组显示,打开后当数组显示时,每一个元素占一行,假设不打开的话。每一个元素则以逗号分隔。

这个选项默认是关闭的。与之相关的两个命令例如以下。我就不再多说了。

set print array off

show print array

set print elements

这个选项主要是设置数组的,假设你的数组太大了。那么就能够指定一个来指定数据显示的最大长度。当到达这个长度时。GDB就不再往下显示了。假设设置为0,则表示不限制。

show print elements

查看print elements的选项信息。

set print null-stop

假设打开了这个选项。那么当显示字符串时,遇到结束符则停止显示。这个选项默觉得off。

set print pretty on

假设打开printf pretty这个选项。那么当GDB显示结构体时会比較美丽。

14.关于显示源代码list

下面是list命令的說明。

参數說明
list filename:number列出某檔案的第幾行,檔案是可省略的。
list [function]列出某函數的程式碼
list繼續印出程式碼
list -印出上一次list的程式碼的前一段程式碼(類似向上翻動)
show listsize顯示現在一次印出幾行
set listsize設定一次印出幾行
备经常使用命令:

1.常看源代码:list(l) 

  list <linenumber> 行号

  list <+offset> 当前行号的正偏移

  list <-offset> 当前行号的负偏移

  list <filename:linenumber> 哪个文件的哪一行

  list <function> 函数名

  list <filename:function> 文件的哪个函数

  list <*address> 程序执行时语句在内存中的地址

 2.设置断点:break(b)

  break <function> 指定函数断点

  break <linenumber> 指定行号断点

  break <+offset/-offset> 当前行号的正/负偏移

  break <filename:linenumber> 哪个文件的哪一行

  break <*address> 执行中的内存地址

  break 不带參数,下一条指令停止处

  break ... if <condition> 在执行中,当condition条件满足时停止。

    eg. break if i=100 //当i=100时。马上停止

break foo if i=100 //断点设置在foo中,断点条件是i-100, 一点在函数foo中,i的值等于100,被停止。

 3.查看信息:info

  info break 查看断点信息

info locals 打印出当前函数中全部局部变量及其值

  info stack 查看栈中信息

info frame 更具体的栈层地址信息

  info args 查看參数信息

  info registers/info all-registers 查看(全部)寄存器信息

  info sources 查看项目的源码信息

4.维护breakpoint:disable/enable/clear/delete

disable(dis) 【breakpoints】 【range...】

假设没有參数,则停止全部的断点,

enable 【breakpoints】【range】

clear <function>/<filename:function>/<linenum>/<filename:linenum>

清楚已定义的停止点

delete [breakpoints] [ranga...]

删除指定的断点

5.恢复程序执行:continue(c)

  

  

6.until和finish

until 跳出循环比較实用

help finish

Execute until selected stack frame returns.

Upon return, the value returned is printed and put in the value history.

finish 用来跳出函数比較实用。

help until

Execute until the program reaches a source line greater than the current

or a specified location (same args as break command) within the current frame
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: