Linux下的调试工具gdb的使用

gdb的介绍

gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。

一般来说,gdb主要帮助你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)

3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

GDB主要来调试C/C++语言写的程序,当然也就可以调试其他语言程序。在linux下使用gdb可以用如下命令
gcc -g 源文件.c -o 输出的目标文件

gdb的常用基本命令

命令命令缩写命令说明
listl显示多行源代码
breakb设置断点,程序运行到断点的位置会停下来
infoi描述程序的状态
runr开始运行程序
displaydisp跟踪查看某个变量,每次停下来都显示它的值
steps执行下一条语句,如果该语句为函数调用则进入函数执行其中的第一条语句
nextn执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句)
printp打印内部变量值
continuec继续程序地运行,直到遇到下一个断点
file装入需要调试地程序
killk终止正在调试地程序
set var name=v设置变量地值
startst开始执行程序,在main函数地第一条语句前面停下来
watch监视变量值地变化
backtracebt产看函数调用信息(堆栈)
framef查看栈帧
quitq退出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函数释放。否则会造成内存泄漏!!如果有错误的地方还请大家指出!谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值