gdb <程序名>:开始调试程序(程序必须以r命令运行)
gdb <程序名>
gdb <程序名> <程序名.core>:显示宕机点(程序尚未运行)
r :运行
r <命令行参数1> <命令行参数2> ...
n :下一步step over(类似VC下F10)
s :下一步step in
l :打印当前运行位置的源代码段
bt :打印callstack
f :打印callstack顶层frame(0)
f n :打印callstack n层frame
i b :打印断点信息
i var :打印所有全局变量信息
i local:打印所有局部变量信息
d n:删除n号断点(可先以i b查看)
finish:跳出当前函数(类似VC下Shift+F11)
u(until):退出循环体
回车:继续执行上一个命令
------------------------ 打印相关 ------------------------
x /20xb 0x84e1b4c:打印从地址0x84e1b4c开始的20个字节,x代表以16进制显示,b表示字节
Format letters are o(octal), x(hex),d(decimal), u(unsigned decimal),
t(binary), f(float), a(address),i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word),g(giant, 8 bytes).
------------------------ 断点相关 ------------------------
~~~ 设置断点 ~~~
b [file:]
b
b
~~~ 跳过断点 ~~~
ignore <断点号> <跳过次数>
~~~ 条件断点 ~~~
condition <断点号> <条件表达式>
简述:当断点时修改下次断点条件
注意:条件表达式语法基本同C
例子:condition 2 a == 8 && b == 5
~~~ 断点指令序列 ~~~
简述: 当断点时设置下次断点发生时执行的指令序列
语法:
commands
指令列表
end
例子:
commands
print "x is %d\n", x
continue
end
示例:
通常先b ... 设置一个断点, 然后当断点发生后用condition设置条件
------------------------打印vector大小和元素 ------------------------
p m_vec._M_impl._M_finish -m_aiSpaces._M_impl._M_start
p *(m_vec._M_impl._M_start)
gdb研究,对应vc调试命令
vc我们常用的几个调试方法对应到gdb应该如何实现呢?
如果实现了,我们就可以用gdb像用vc那样调试那样轻松了。
gdb vc调试对照表:
实现功能 vc gdb
修改后编译 f7 make
跳出函数(step out) shift+f11 finish,f
重新启动ctrl+shift+f5 run,r
运行到指定行 f9+f5tbreak,tb + continue,c
中断程序ctrl+alt+break ctrl+c
中断后继续运行 f5continue,c
中断后单步 不可以 next,n
条件中断 无法实现有多种条件设置方法(附1)
观察变量条件 变量上方右键添加监视有多种情况处理(附2)
查看断点信息 alt+f9info break,i b
清除所有断点ctrl+shift+f9 del,d
清除指定断点 鼠标到指定断点处f9 del 想清除的断点号
跳出循环 在循环后代码除右键运行到此处 until,u(在for,while行)
查看函数中变量 alt+4info local,其中display 变量名可在离开函数前实时观察自动打印不用每次都运行info local
查看参数 鼠标放在参数上 info arg,info args
中断时查看堆栈 alt+7break trace,bt
查看堆栈中某函数处相关变量 鼠标选择 frame +num(在堆栈中编号),up,down
在某个断点修改变量值 直接在变量窗口修改 set,s +变量名=XX
附1:
条件中断 无法实现有多种条件设置方法(附1)
(1)
b if 条件
比如 b if i ==1,或者 b ifstr="abc"
如果断点已经设置,infobreak查看断点号
condition 断点号条件
比如 condition 1NULL == p
(2)
断点命中次数会被统计,i b可以查看
可以设定某个断点被命中N次后中断
比如:ignore 3 10
第3个断点在运行上面命令后再命中10此才中断,默认命中0次后中断,也就是每次都中断
有了这个条件就可以在自己想要的命中次数后中断来查看变量情况了,对中途出错
时候的调试很有帮助
附2
观察变量条件 变量上方右键添加监视有多种情况处理(附2)
(1)
watch 变量或者表达式
就相当于设置了一个硬断点,当变量被修改时就会中断程序,并打印修改前后的值
表达式可以是地址前面加上强制类型,这样对全局不可见但是地址不变的变量监视很有用处
一些重要提示:
(1)list 文件名:行号和 b 文件名:行号这两个命令要在b main ;run后才有效
(2)b后面不加如何东西表示在当前行设置断点
(3)p 局部变量提示no symbol XX in current context错误,编译选项在-g的基础上机上-O0和-wall和-ggdb,比如是cpp那么设置:CXX_FLAGS = -O0 -wall -g -ggdb
(4)List 行号,函数名,变量名是默认在查询当前活动文件,当前活动文件也就是list 文件名或者函数名进入的文件,或者中断后所在的文件,可想象成vc中当前打开的文件,可以在上面直接运行 b行号,也不用多此一举的b 文件名 行号了,不过前提时确保当前活动文件是否是你想要设置断点的文件。