使用gdb进行调试中级篇

  闲话少叙,经过上篇文章的铺垫后,咱们趁热打铁,继续学习。

  设置断点

  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

  

  

posted @ 2012-02-08 18:46  ~大器晚成~  阅读(3522)  评论(3编辑  收藏  举报