gdb 调试程序

GDB调试

要进行调试程序首先要生成一个含有调试信息的执行程序命令如下:

  • gcc(g++) -g -o 文件名 源文件.c(源文件.cpp)
  • gcc(g++) -ggdb3 -o 文件名 源文件.c(源文件.cpp)

此时便会生成一个含有调试信息的可执行文件,然后便可以用 gdb 去调试这个程序了,进入调试程序命令,但是如果用 gdb 去调试一个未包含调试信息的可执行文件则会发生错误

  • gdb 执行文件名(含调试信息)

 

 

GDB 工作环境相关命令

  1. show args    查看设置好的运行参数
  2. path dir   设定程序的运行路径
  3. show parths    查看程序的运行路径
  4. pwd     显示当前工作目录

 

 

查看源程序

显示源代码

  1. list [linenum | filename:linenum]  显示程序第linenum行的周围的源程序.
  2. list [function | filename:function]  显示函数名为function的函数的源程序.
  3. list 显示当前行后面的源程序.
  4. list - 显示当前行前面的源程序.
  5. list n   行号.
  6. list +num   当前行号的正偏移量.
  7. list -num   当前行号的负偏移量.
  8. list *address  程序运行时的语句在内存中的地址.
  9. list first,last  显示从first行到last行之间的源代码.
  10. list,last      显示从当前行到last行之间的源代码.
  11. list +    往后显示源代码.

设置显示的函数

  1. set listsize count 设置一次显示源代码的行数.
  2. show listsize   查看当前listsize的设置.

搜索源代码

  1. forward-search regexp    向后搜索
  2. search regexp   向前面搜索
  3. reverse-search regexp  全部搜索.
    <regexp>就是正则表达式,也主一个字符串的匹配模式,关于正则表达式,我就不在这里讲了,还请各位查看相关资料.

 

 

断点

设置断点

  1. break [function | filename:function] 在进入指定函数时停住.C++ 中可以使用 class::function或function(type,type)格式来指定函数名.简写命令为b
  2. break [linenum | filename:linenum]  在指定行号停住.
  3. break [+ | -]offset 在当前行号的前面或后面的 offset 行停住.offiset 为自然数.
  4. break    break 命令没有参数时,表示在下一条指令处停住.
  5. break ... if  condition     ...可以是上述的参数,condition 表示条件,在条件成立时停住.比如在循环境体中,可以设置 break if i=100,表示当 i 为 100 时停住程序.
  6. tbreak 用法同 break 相同只设置一个临时断点,当程序遇到临时断点停住以后,对应断点被自动删除.

查看断点信息

  1. info [breakpoints | break]

禁用/启用断点

  1. disable [breakpoints  | range] disable 所指定的停止点,breakpoints 为停止点号.如果什么都不指定,表示 disable 所有的停止点.简写命令是 dis . range 表示断点号的范围(如:3-7)
  2. enable [breakpoints | range] enable 所指定的停止点,breakpoints 为停止点号.

清除断点

  1. clear 清除所有的已定义的停止点.
  2. clear [function | filename:function]  清除所有设置在函数上的停止点.
  3. clear [linenum | filename:linenum]   清除所有设置在指定行上的停止点.

删除断点

  1. delete [breakpoints | range]删除指定的断点, breakpoints 为断点号.如果不指定断点号,则表示删除所有的断点.range 表示断点号的范围(如:3-7),简写命令为 d

设置和清除断点的停止条件

  1. condition bnum expression 修改断点号 为bnum 的停止条件为 expression.
  2. condition bnum 清除断点号为 bnum 的停止条件.

运行时忽略断点

  1. ignore bnum count 表示忽略断点号为 bnum 的停止条件 count 次.

设定断点处运行命令

  1. 设置断点运行命令( bnum:断点号, command-list: 程序在断点停住是做出的z指令)
    commands [bnum]
    ... command-list ...
    end
  2. 取消断点运行命令
    commands [bnum]
    end

例如:

(gdb)break foo if x>0
.....................(一些断点信息)
(gdb)commands 1
.....................(一些输入 commands 命令后的提示信息)
>printf "x is %d/n",x
>continue
>end

断点设置在函数 foo 中,断点条件是 x>0 ,如果程序被断住后,也就是,一旦 x 的值在 foo 函数中大于 0,GDB 会自动打印出 x 的值,并继续运行程序.

如果你要清除断点上的命令序列,那么只要简单的执行一下 commands命令 ,并直接在打个end就行了.

 

 

运行程序 

运行程序

  1. run 让程序在 gdb 中运行

恢复运行中断后的程序

持续运行:

  1. continue [ignore-count]
  2. c [ignore-count]
  3. fg [ignore-count]
    恢复程序运行,直到程序结束,或是下一个断点到来.ignore-count 表示忽略其后的断点次数.continue,c,fg 三个命令都是一样的意思.
  4. finish 运行程序,直到当前函数完成返回.并打印函数返回时的堆栈地址和返回值及参数值等信息.
  5. until/u 当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体.

单步运行:

  1. step count 单步跟踪,如果有函数调用,他会进入该函数.进入函数的前提是,此函数被编译有debug信息.后面加 count 表示执行后面的 count 条指令,然后再停住,不加表示一条条地执行.
    设置单步运行模式(step-mode)
    • set step-mode on 打开 step-mode 模式,于是,在进行单步跟踪时,程序不会因为没有 debug 信息而不停住.这个参数有很利于查看机器码.
    • set step-mod off 关闭 step-mode 模式.
  2. next count 同样单步跟踪,如果有函数调用,他不会进入该函数.后面加 count 表示执行后面的 count 条指令,然后再停住,不加表示一条条地执行.
  3. stepi / si    单步跟踪一条机器指令
  4. nexti / ni   单步跟踪一条机器指令

查看函数堆栈信息

  1. backtrace n  n 若为正整数,表示打印栈顶上n层的栈信息,若为负整数,表示打印栈底下n层的栈信息,命令缩写为bt

 

 

观察点

用于观察某个表达式(变量)的值是否有变化了,如果有变化,马上停住程序

设置观察点

  1. watch expr 为表达式(变量)expr设置一个观察点.一量表达式值有变化时,马上停住程序.
  2. rwatch expr 当表达式(变量)expr被读时,停住程序.
  3. awatch expr 当表达式(变量)的值被读或被写时,停住程序.

查看观察点信息 

  1. info watchpoints

 

 

 

参考文献连接

http://blog.csdn.net/haoel/article/details/2879

你可能感兴趣的:(gdb 调试程序)