三、gdb调试(下)
01.查看运行时数据
print - 查看变量值
ptype - 查看类型
print array - 查看数组
print *array@len - 查看动态内存
print x =5 - 改变运行时数据
#vi simple.c
#include<stdio.h>
long fun(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<10;i++)
{
arr2[i] = i;
}
printf("Entering main ...
");
for(i=0;i<argc;++i)
{
printf("%s ",argv[i]);
}
printf("
");
long result = 0;
for(i=1;i<100;++i)
{
result += i;
}
printf("result[1-100] = %d
", result);
printf("result[1-10] = %d
",func(10));
printf("Exiting main ...
");
retuln 0;
}
02.gdb调试逻辑错误
#vi reverse.c
#include<stdio.h>
int main(void)
{
int i;
char str[6] = "hello";
char reverse_str[6] = "";
printf("%s
",str);
for(i=0;i<5;i++)
reverse_str[5-i] = str[i];(逻辑出错的地方
,将reverse_str[5-i]改为reverse_str[4-i])
printf("%s
",reverse_str);
return 0;
}
:wq
#make
#./reverse
hello
(空,出错的原因:单步调试在循环完成后,查看reverse_str的结
果,p reverse_str,结果是" 00olleh",而打印时以" "开头,所
以停止。
#make clean
#make
#./reverse
03.gdb调试段错误
段错误是由于访问非法地址而产生的错误。
访问系统数据区,尤其是往系统保护的内存地址写数据。最常
见就是给一个指针以0地址;
内存越界(数组越界,变量类型不一致)访问到不属于你的内
存区域
#vi bugging.c
#include<stdio.h>
#include<stdlib.h>
void segfault()
{
int *p = NULL;
*p = 100;
}
int main(void)
{
segfault();
char buf[1] = "a";
buf[10003] = "A";
printf("%c
",buf[10003]);
return 0;
}
#./bugging.c
段错误
Starting program:
/home/study/cppcourse/devtool/06gdb/bugging
Program received signal SIGSEGV,Segmentation fault.
(gdb)bt(栈回溯)
#0 0x12345678 in segfault () at bugging.c:7
#1 0x12345678 in main() at bugging.c:12
#2 0x12312312 in __libc_start_main() from
/lib/tls/llibc.so.6
04.core文件调试
core文件
在程序崩溃时,一般会生成一个文件叫core文件。core文
件记录的是程序崩溃时的内存映像,并加入调试信息。core文件生
成的过程叫做core dump
设置生成core文件
ulimit -c 查看core-dump状态
ulimit -c 数字(如:ulimit -c 1024)
ulimit -c unlimited
gdb利用core文件调试
gdb文件名core文件
bt
#ulimit -c
0(表示无法查看core文件的名)
#./bugging.c
段错误(core dumped)
#ulimit -a
core file size (blocks size) 0
#ls
core.9351
#gdb bugging core.9351
……
(gdb)bt(查看栈回溯信息)
gdb总结
查看运行时数据
程序错误
gdb调试逻辑错误
gdb调试段错误
core文件