gdb
<a>表示a内容必须写
[a]表示a内容可写可不写
{a}表示a给出的选择必须选一个
1.gdb启动
# 可执行程序不需要参数 gdb ./program gdb program core gdb program pid #指定进程运行的pid,比如1234
2.程序运行/调试
#2.1程序运行参数 set args #指定运行参数,如set args 10 20 show args #展示运行参数 #2.2程序运行 run [args] #args可有可不有,一直运行断点位置 (r) continue #运行到下一个断点位置 (c) next #单步,但不进入函数内部 step #单步,进入函数内部 finish #退出函数 until #退出循环体 #2.3工作目录 cd #相当于shell的cd命令 pwd #显示当前的所在目录 #2.4程序输入输出 run > <输出文件>
3.断点
#断点 break (b) #functionname也可以使用function(type,type)格式来指定函数名 ## 设置断点 b 10 #在源程序第10行断点 b func #在func入口断点 b <namespacename>::<classname>::<functionname> #在进入指定类名空间的指定类的指定函数停住 b <filename>:<linenum> #在进入指定文件的第linenum行停住 b <filename>:<functionname> ## 查询断点 info break ## 条件断点 b test.c:8 if intValue == 5 #当intvalue==5时,暂停 condition bnum expression #当expreession成立,点号bnum暂停 Ignore bnum count #忽略断点号为bnum的停止条件count次 ## 删除断点 clear #删除所有断点 clear <linenum> #除所有设置在指定行上的停止点。 clear <functionname> #删除所有设置在funtionname上的断点 clear <filename>:<linenum> #清除所有设置在指定文件:指定行上的停止点。 delete [breakpoints] [range...] #删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7),其简写命令为d disable [breakpoints] [range...]#disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis. enable [breakpoints] [range...] #enable所指定的停止点,breakpoints为停止点号。 enable [breakpoints] once range…#enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。 enable [breakpoints] delete range#enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。 ## 为断点设置自动化调试 commands [bnum] … command-list … end eg: break foo if x>0 commands printf “x is %d “,x continue end
4.观察点
#设置观察点 watch <expression> #当表达式值有变化时,马上停住程序。 rwatch <expression> #表达式(变量)expr被读时,停住程序 awatch <expression> # 表达式(变量)的值被读或被写时,停住程序 ##展示观察点 info watchpoint
5.显示
#打印当前值 print(p) #打印变量、字符串、表达式等的值,可简写为p #变量 #1、全局变量(所有文件可见的) #2、静态全局变量(当前文件可见的) #3、局部变量(当前Scope可见的) #如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量 #如果此时你想查看全局变量的值时,你可以使用“::”操作符 #数组变量 p *array@len #有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度 #自动显示 ## 设置自动显示 display expr display/fmt expr #eg:display/d expr display/fmt addr #删除自动显示 undisplay dnums delete display dnums #启动或失效自动显示 disable display dnums enable display dnums # 查看自动显示的信息 info display #历史记录 show values #print最后十个记录 show values n #print n 附近的10个记录 show values + #print 上一次print value 后的10个记录 #查看源代码 list <linenum> list <functionname> list #展示当前行后的源程序 set listsize count#设置一次显示源代码的行数
6.改变程序执行
# 修改变量值 print x=5 set var x=7 #跳转执行 jump linespec #指定下一条语句的运行点。可以是文件的行号,可以是file:line格式,可以是+num这种偏移量格式。表示下一条运行语句从哪里开始 jump *address #这里的是代码行的内存地址 #产生信号量 signal signal #强制函数返回 return return expr #使用return命令取消当前函数的执行,并立即返回,如果指定了,那么该表达式的值(expr)会被认作函数的返回值 ## 强制调用函数 call expr
7.线程
# 设置断点 break linespec thread threadno break linespec thread threadno if condition #linespec指定了断点设置在的源程序的行号threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过“info threads”命令来查看正在运行程序中的线程信息。如果你不指定‘thread threadno ’则表示你的断点设在所有线程上面 #查看栈信息 breacktrace #快捷命令,bt bt n #打印栈顶上n层的栈信息 bt -n #打印栈底下n层的栈信息 frame n#查看当前 n层的栈信息 up n #表示向栈的上面移动n层,可以不打n,表示向上移动一层。 down n #表示向栈的下面移动n层,可以不打n,表示向下移动一层。 eg: frame 3 up 2 frame #此时打印第五层信息 #信号 handle signal [keywords...] # keywords列表如下: nostop #当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号。 stop #当被调试的程序收到信号时,GDB会停住你的程序。This implies the print keyword as well. print #当被调试的程序收到信号时,GDB会显示出一条信息。 noprint #当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。This implies the nostop keyword as well. pass noignore #当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序处理 or else it may terminate if the signal is fatal and not handled. nopass ignore#当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。