(P5)Linux开发工具——gdb入门下

1.查看运行时的数据

  • print 查看变量值
  • ptype 查看类型
  • print array 查看数组,查看数组,是查看的是静态数组
  • print *array@len 查看动态内存,查看动态数组,静态数组都可以
  • print x=5 改变运行时的数据
  • eg:
p arr1
这里数组名是打印整个数组的元素

p &arr1
打印数组的地址

p *arr2@10
查看内存的10个元素

p arr2[2]@2
查看内存包含第二个元素,2号,3号元素打印出来

p arr1@2
arr1是一个整体,2表示打印两个数组,总共20个数组打印出来
  • eg代码:
    05\02\simple.c
#include <stdio.h>
#include <stdlib.h>

long func(int n);

int main(int argc, char *argv[])
{
    int i;
    int x = 5;
    double z = 2.5;
    char ch = 'q';

    int arr1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int *arr2 = (int *)malloc(sizeof(int)* 10);

    for (i=0; i<argc; i++)//argc:参数的个数
    {
        printf("%s ", argv[i]);//打印参数列表
    }
    printf("\n");
    long result = 0;
    for (i=1; i < 100; i++ )
    {
        result += i;
    }
    printf("result[1-100] = %ld\n", result);
    printf("result[1-10] = %ld\n", func(10));

    printf("Exiting main ...\n");
    return 0;
}

long func(int n)
{
    long sum = 0;
    int i;
    for (i = 1; i <= n; i++)
    {
        sum += i;
    }
    retuen sum;
}
  • eg结果:
    在这里插入图片描述

2.程序错误

  • 编译错误
    编写程序的时候没有符合语言规范导致的编译错误
  • 运行时错误
    编译器检查不出这种错误,但在运行时可能会导致程序崩溃;
    eg:非法地址访问
  • 逻辑错误
    编译和运行都很顺利,但是程序没有干它该干的事情

3.gdb调试逻辑错误

  • 因为第一个字符串是\0,因为字符串的输出是以\0为标记的,所以后面的字符串没有输出
    olleh应该向前推一格,也就是说第一个输入的字符下标应该为4,所以应该改成reverse_str[4-i]
  • eg:测试代码
    05\02\reverse.c
#include <stdio.h>

int main(void)
{
    int i;
    char str[6] = "hello";
    char reverse_str[6] = "";

    printf("%s\n", str);
    for (i = 0; i < 5; i++)
        reverse_str[5-i] = str[i];
    printf("%s\n", reverse_str);
    return 0;
}

//这个程序实现逆序输出字符串hello,但是却没有任何输出
  • eg:测试结果
    在这里插入图片描述
    改完后的结果如下:
    在这里插入图片描述

4.gdb调试段错误

  • 段错误是由于访问非法地址而产生的错误
    (1)访问系统数据区,尤其是往系统保护的内存地址写数据。最常见就是给一个0地址的指针写入数据
    (2)内存越界(数组越界,变量类型不一致等)访问到不属于你的内存区域

  • eg:测试代码
    05\02\bugging.c

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

void segfault()
{
    int *p = NULL;
    *p = 100;
}

int main(void)
{
    // segfault();//段错误产生原因1,给一个零地址的指针写入数据

    //段错误产生2:访问越界的内存
    char buf[1]="a";
    buf[10003] = 'A';
    printf("%c\n", buf[1003]);

    return o
}

5.core文件调试

  • core文件
    在程序崩溃时,一般会生成一个文件叫core文件。
    core文件记录的是程序崩溃时的内存映像,并加入调试信息。
    core文件生成的过程叫做core dump。

  • 设置生成的core文件
    (1)ulimit -c 查看core-demp状态
    (2)ulimit -c 数字(eg,ulimit -c 1024)
    (3)ulimit -c unlimited

  • gdb利用core文件调试
    (1)gdb 文件名 core文件
    (2)bt

  • eg:测试代码:05\02\bugging.c

  • core文件使用的测试大致定位过程:
    在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章