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函数释放。否则会造成内存泄漏!!如果有错误的地方还请大家指出!谢谢!
本文详细介绍GDB这一强大的Linux程序调试工具的功能与基本命令,通过示例讲解如何使用GDB定位和修复C/C++代码中的常见错误,如野指针操作和内存泄漏。
1597

被折叠的 条评论
为什么被折叠?



