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