日期:2014-05-16  浏览次数:20375 次

GDB简单应用
简单示例:

#include <stdio.h>

int func(int n)
{
int sum =0,i;
for(i=0;i<n;i++)
{
  sum+=i;
}
return sum;
}
/***
*This test gdb programme;
*
***/
int main( int argc, char *argv[] )
{
  int i;
  long result = 0;
  for(i=1; i<=100; i++)
  {
   result += i;
  }
  printf("result[1-100] = %d \n", result );
  printf("result[1-250] = %d \n", func(250) );
  return 0;
}
打开MSYS Shell编译: gcc -g tst.c -o tst
GDB的命令Help

敲入b按两次TAB键,你会看到所有b打头的命令:
(gdb) b

backtrace break bt
(gdb)
1.设置断点
break <function>
在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。

可以设置break if i=100,表示当i为100时停住程序。

2. 观察断点

watch <expr>
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。

rwatch <expr>
当表达式(变量)expr被读时,停住程序。

awatch <expr>
当表达式(变量)的值被读或被写时,停住程序。

info watchpoints
列出当前所设置了的所有观察点。

3. 捕捉断点

catch <event>
当event发生时,停住程序。event可以是下面的内容:
1、throw 一个C++抛出的异常。(throw为关键字)
2、catch 一个C++捕捉到的异常。(catch为关键字)
3、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
4、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
5、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
6、load 或 load <libname> 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
7、unload 或 unload <libname> 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)

4.清除断点

clear <linenum>;

clear <function>;
delete [breakpoints] [range...]

disable [breakpoints] [range...]

enable [breakpoints] [range...]

5. 单步执行

continue [ignore-count]

step <count>

next <count>

set step-mode on

6.查看栈信息

backtrace 活着bt

frame 或 f

7. 查看原程序

list 或者l

8. 查看源代码内存

info line tst.c:func

查看汇编代码:
disassemble func

9. 参看运行数据

print /<f> <expr> f为数据格式


查看数组:

(gdb) p *array@len

display/<fmt> <expr>

查看寄存器:

info registers

info all-registers