gdb的介绍
gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。
一般来说,gdb主要帮助你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
GDB主要来调试C/C++语言写的程序,当然也就可以调试其他语言程序。在linux下使用gdb可以用如下命令
gcc -g 源文件.c -o 输出的目标文件
gdb的常用基本命令
命令 | 命令缩写 | 命令说明 |
---|---|---|
list | l | 显示多行源代码 |
break | b | 设置断点,程序运行到断点的位置会停下来 |
info | i | 描述程序的状态 |
run | r | 开始运行程序 |
display | disp | 跟踪查看某个变量,每次停下来都显示它的值 |
step | s | 执行下一条语句,如果该语句为函数调用则进入函数执行其中的第一条语句 |
next | n | 执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句) |
p | 打印内部变量值 | |
continue | c | 继续程序地运行,直到遇到下一个断点 |
file | 装入需要调试地程序 | |
kill | k | 终止正在调试地程序 |
set var name=v | 设置变量地值 | |
start | st | 开始执行程序,在main函数地第一条语句前面停下来 |
watch | 监视变量值地变化 | |
backtrace | bt | 产看函数调用信息(堆栈) |
frame | f | 查看栈帧 |
quit | q | 退出gdb环境 |
gdb调试代码示例
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void get_memory(char *ptr, int size);
void test();
int main (int argc, char **argv)
{
test();
return 0;
}
void test()
{
char *ptr = NULL;
printf("before get_memory func ptr add:%p\n", ptr);
get_memory(ptr, 100);
printf("after get_memory func ptr add:%p\n",ptr);
strcpy(ptr, "Hello world\n");
}
void get_memory(char *ptr, int size)
{
ptr = malloc(size);//调用malloc函数动态申请内存
printf("malloc ptr add:%p\n", ptr);
}
我们先分析以下上面的代码吧,在test函数中我们调用了个get_memory函数,用malloc函数动态申请内存,在该函数中ptr的确是被分配到了内存空间,当调用完get_memory离开后,malloc函数分配的那段内存空间就失效了,所以ptr还是为空,即在test()函数中进行strcpy()时因为ptr为空,所以出现了段错误。
在理解上面的基础上我们可以使用gdb调试工具,来调试上面的错误。
在linux上输入以下命令行
gcc -g test_gdb.c -o gdb
gdb ./gdb
下面是这个代码调试的过程如下图:
很明显我们对一个野指针进行了操作,才抛segmentation fault ,对于解决上面的问题,也很容易解决,我们把ptr的地址传进get_memory中就可以解决了,但是上面的程序还有错误,细心的同学发现我们调用了malloc函数,而没有使用free函数释放,所以大家一定要记住使用malloc一定要使用free函数释放。否则会造成内存泄漏!!如果有错误的地方还请大家指出!谢谢!