(P5)Linux开发工具——gdb入门下
原创
©著作权归作者所有:来自51CTO博客作者喜欢打篮球的普通人的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 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个数组打印出来
#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;
}
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,但是却没有任何输出
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文件大致定位段错误的过程如下: