文章目录

  • ​​1.查看运行时的数据​​
  • ​​2.程序错误​​
  • ​​3.gdb调试逻辑错误​​
  • ​​4.gdb调试段错误​​
  • ​​5.core文件调试​​

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);

printf("Entering main ...\n");
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;
}
return 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文件大致定位段错误的过程如下:
  • (P5)Linux开发工具——gdb入门下_数组