闲话少叙,经过上篇文章的铺垫后,咱们趁热打铁,继续学习。
设置断点
break <function> 在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。
break <linenum> 在指定行号停住。
break filename:linenum 在源文件filename的linenum行处停住
break filename:function 在源文件filename的function函数的入口处停住
break *address 在程序运行的内存地址处停住
break if i=100 表示当i为100时停住程序
info breakpoints(info break) 查看断点
设置观察点(WatchPoint)
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:
watch <expr> 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序
rwatch <expr> 当表达式(变量)expr被读时,停住程序
awatch <expr> 当表达式(变量)的值被读或被写时,停住程序
info watchpoints 列出当前所设置了的所有观察点
删除观察点或断点
clear 清除所有设置在函数上的停止点
clear <function> 清除所有设置在函数上的停止点
delete [breakpoints] [range...] 删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d
disable [breakpoints] [range...] disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis.
enable [breakpoints] [range...] enable所指定的停止点,breakpoints为停止点号。
恢复程序运行和单步调试
当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用step或next命令单步跟踪程序。
continue (c)恢复程序运行,直到程序结束,或是下一个断点到来
step <count> 单步跟踪,如果有函数调用,他会进入该函数.后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。
next <count> 同样单步跟踪,如果有函数调用,他不会进入该函数
set step-mode on/off 打开/关闭step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码
finish 运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息
until 或 u 当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体.
nexti 或 ni 单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。与之一样有相同功能的命令是“display/i $pc” ,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)
查看栈信息
当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用GDB命令来查看当前的栈中的信息。
backtrace 打印当前的函数调用栈的所有信息
frame <n> 查看某一层的信息
frame 会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。
info f 这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。
info args 打印出当前函数的参数名及其值
info locals 打印出当前函数中所有局部变量及其值。
info catch 打印出当前的函数中的异常处理信息。
以上是关于gdb的一些使用说明,都很简单。下一次打算介绍一下如何查看运行过程中变量的值和内存地址,也就算是最常用的部分了,我姑且称之为高级篇,希望大家不要见笑。
注:如果希望了解更多关于gdb的知识,请看http://blog.csdn.net/haoel/article/details/2879
来源:https://www.cnblogs.com/luchen927/archive/2012/02/08/2342047.html