关于 gdb 的一些命令使用

Linux下gdb的使用和命令

一般来说,GDB主要帮忙你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)

3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、动态的改变你程序的执行环境。

(命令行的调试工具却有着图形化工具所不能完成的功能)


下面介绍gdb常用的命令

1. 显示源代码,必须在编译的时候使用 -g 参数才可以

list:

(gdb) list
显示当前运行位置的前5行和后5行代码

(gdb) list function
(gdb) list filename:function
显示所指向的本文件的函数或者其他文件内函数的前2行和后8行代码

(gdb) list -
往前显示代码

(gdb) list +
往后显示代码

这些命令默认都是显示10行,可以用set listsize 20 修改显示的行数为20行,用show listsize查看当前设置的显示数量.

list命令还有下面的用法:

(gdb) list <first>, <last>
显示从first行到last行之间的源代码。

(gdb) list , <last>
显示从当前行到last行之间的源代码。

2. 查看运行时数据

print:

在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p)print命令的格式是:
(gdb) print n

打印出变量n的值,可以按照指定的进制查看变量的值,比如 int n=5 可以使用 print/x n 命令得到 $26 = 000000101结果
(gdb) whatis p
type = int*
显示某个变量的类型

(gdb) print Findfuc(1,0)
对程序中函数的调用

(gdb) print *pCTable
$8={e=reference=’/000’,location=0x0,next=0x0}
数据结构和其他复杂对象

(gdb)print h@10
$13=(-1,345,23,-234,0,0,0,98,345,10)
查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示:base@length

display:

还没怎么接触过,留空.

backtrace:

打印当前的函数调用栈的所有信息。如:
(gdb) bt
#0 func (n=250) at tst.c:6
#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
从上可以看出函数的调用栈信息:__libc_start_main --> main() --> func()

frame up down:

切换栈
(gdb) frame 1
切换到bt显示出来的栈序号为1的栈中去.
比如:frame 0,表示栈顶,上面的例子中就是func所在栈,一般当前程序执行的位置的栈就是栈顶,frame 1,表示栈的第二层,
main函数所在栈

(gdb) up n
表示向栈的上面移动n层,可以不打n,表示向上移动一层。

(gdb) down n
表示向栈的下面移动n层,可以不打n,表示向下移动一层。

3. 断点

break:

break命令(可以简写为b)可以用来在调试的程序中设置断点.
(gdb) break filename:line-number
在指定文件的指定行上设置一个断点

(gdb) break filename:function-name
在指定文件的指定函数入口处设置一个断点

(gdb) break line-or-function if expr
在指定行号或者指定函数内设置一个断点,当expr条件成立时断住程序,如:break 46 if dwCount==100

(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x000028bc in CApp:Init at CApp.cpp:155
2 breakpoint keep y 0x0000291c in main at GameApp.cpp:168
显示断点信息

(gdb) delete breakpoint 1
删除编号为1的断点

(gdb) delete breakpoint
删除所有断点

watch :

设置观察点,还没怎么用过,留空

catch :

设置捕捉点,还没怎么用过,留空

4. 执行

run continue next step finish until:

程序执行

(gdb) set args
可指定运行时参数。(如:set args 10 20 30 40 50

(gdb) show args
查看设置好的运行参数

(gdb) run
执行程序

(gdb) continue
执行到下一个断点 相当于vs里的F5快捷键

(gdb) next
执行下一句代码 相当于vs里的F10快捷键

(gdb) step
执行下一句代码,如果下一句代码调用了函数,那么进入该函数,相当于vs里的F11快捷键

(gdb) finish
跳出当前函数,相当于vs里的shift+F11快捷键

(gdb) until
跳出当前while或者for循环(这个貌似在vs里是没有的,求大牛指点)

jump:

跳转执行,还没怎么用过,留空

call:

强制调用函数,留空

5. 其他

还有一些关于”信号”,”搜索”等没怎么接触过的命令和用法,有待以后工作和学习中接触到之后再填补.