以Segmentation fault的错误为例简单介绍Linux的调试工具gdb

目录

 

gdb简介

 主要功能

gdb的基本使用命令

gdb的主要使用方式

总结


​​​​​​​

  • gdb简介

UNIX及UNIX-like下的调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具相比于VC、z的优点是具有修复网络断点以及恢复链接等功能,比BCB的图形化调试器有更强大的功能。所谓“尺有所短,寸有所长”就是这个道理。

  •  主要功能

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

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

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

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

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

  • gdb的基本使用命令

命令

命令缩写

命令说明

list

l

显示多行源代码

break

b

设置断点,程序运行到断点的位置会停下来

info

i

描述程序的状态

run

r

开始运行程序

display

disp

跟踪查看某个变量,每次停下来都显示它的值

step

s

执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句

next

n

执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句)

print

p

打印内部变量值

continue

c

继续程序的运行,直到遇到下一个断点

set var name=v

设置变量的值

start

st

开始执行程序,在main函数的第一条语句前面停下来

file

装入需要调试的程序

kill

k

终止正在调试的程序

watch

监视变量值的变化

backtrace

bt

产看函数调用信息(堆栈)

frame

f

查看栈帧

quit

q

退出GDB环境

  • gdb的主要使用方式

  1. 先要对需要调试的代码进行gcc -g 的编译
    gcc -g test_gdb.c -o test_gdb
  2. 使用gdb调试错误代码
    gdb ./test_gdb

  3. 设置断点运行程序并用print打印所要跟踪的变量的值

    break 12         //在十二行设置断点
    b main           //在main函数处设置断点
    r (run)          //运行程序
    print var_naem   // 打印var_naem的值
    c(continue)      //到断点处打印完调试信息继续运行,直到遇到下一个断点
    s(step)          //执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句
    n(next)          //执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句)

  • 总结

这道题目的错误和我们刚刚开始写swap函数一样,因为函数传参只是简单的值传递,所以我们在调用getmemory()函数之后,ptr的确是被分配到了内存空间,但是在离开getmemory函数之后,getmemory()函数分配的那段内存空间就失效了,所以ptr还是为空,即在test()函数中进行strcpy()时因为ptr为空,所以出现了段错误。更正也比较简单,可以使用传地址或是使用返回值的形式进行函数调用。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void  get_memroy(char ** ptr, int size);
char* get_memroy1(char * ptr, int size);
void test01();

int main(int argc, char *argv[])
{
    test01();
    return 0;
}

void get_memroy(char ** ptr, int size)
{   
    *ptr = malloc(size);
}

char* get_memroy1(char * ptr, int size)
{  
    ptr = malloc(size);
    return ptr;
}  
   
   
void test01()
{  
   
    char*   ptr = NULL;

    ptr = get_memroy1(ptr, 100);
    strcpy(ptr, "Hello Word\n");
    printf("%s", ptr);

    free(ptr);
}
发布了47 篇原创文章 · 获赞 37 · 访问量 3680

猜你喜欢

转载自blog.csdn.net/qq_44045338/article/details/105378654