关于 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. 其他
还有一些关于”信号”,”搜索”等没怎么接触过的命令和用法,有待以后工作和学习中接触到之后再填补.