Gdb是一款强大的调试工具,虽然没有图形化界面但是,其功能却更加强大
一个调试案例tst.c
#include<stdio.h>
int fun(int n)
{
int sun=0;
for(int i=0;i<n; ++i)
{
sum+=1;
}
return sum;
}
int main()
{
int i=0;
long result=0;
for(i =1;i<=100;++i)
{
result += i;
}
printf("result[1-100] = %d\n",result);
printf("result[1-250] = %d\n",fun(250));
}
使用gdb进行调试,要注意再编译生成可执行文件的时候的格式:
gcc -g tst.c -o tst //一定要注意加上参数 ‘ -g ’
调试命令
//启动gdb
gdb tst <-----------启动gdb
(gdb)l <-------------l命令相当于list,从第一行列出源码
(gdb) <------------直接回车,重复上一次的命令
(gdb) break 16 <----------------设置断点,在源程序第16行处
(gdb)break fun <----------------设置断点,在函数fun的入口处
(gdb)info break <----------------查看断点信息
(gdb)r <-----------------运行程序,run命令简写
(gdb)n <------------------单条语句执行,next命令简写
(gdb)c <------------------继续运行程序,continue命令的简写
(gdb)p i <----------------打印变量i的值,printf命令简写
(gdb)bt <-----------------查看函数堆栈
一般来说GDB调试的C/C++的程序,首先在编译时,我们必须把调试信息加到可执行文件中去,使用‘-g’参数就可以到达这一点。
基本上有以上这些常用的命令就足够我们平时的编译操作了。
随着工作难度的不断深入,随之而来的是之前总结的GDB调试经验已经不足以应对了,学会更多的操作方式有利于更好地发现程序当中的错误;
shell <command string> <-----------可以调用unix的shell来执行command命令
make <make-agrs> <--------------可以在gdb中使用make重新build自己的程序
set args <---------可指定运行时参数
show args <-----------可以查看设置好的运行参数
path <dir> <----------可以设定程序的运行路径
set environment varname [=value] <-----设置环境变量
show environment <-----------查看环境变量
调试已经运行的程序
在程序运行的过程中,可以通过进程号进入GDB调试,首先通过ps aux | grep "要调试的进程名"找到进程号,然后通过:
gdb -p 进程号 <-----------开始调试进程
设置观察点
观察点一般来观察某个表达式(变量也是一种表达式)的值是否发生了变化,如果变化了,马上停住程序:
设置观察点的几种方法:
watch <expr> <---------------为表达式(变量)expr设置一个观察点,当表达式的值有变化时马上挺住程序
rwatch <expr> <----------------当表达式被读时马上停住程序
awatch <expr> 《-----------当表达式被读或者被写时马上挺住程序
info watchpoints <--------------列出当前所设置了的所有观察点
设置捕捉点
可以设置捕捉点来捕捉程序运行时的一些时间。
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下有用)
tcatch <event>
只设置一次捕捉点,当程序停住以后,应点被自动删除。