你的位置:首页 > 操作系统

[操作系统]Linux开发工具之gdb(下)


三、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 ...\n");
for(i=0;i<argc;++i)
{
printf("%s ",argv[i]);
}
printf("\n");
long result = 0;
for(i=1;i<100;++i)
{
result += i;
}
printf("result[1-100] = %d\n", result);
printf("result[1-10] = %d\n",func(10));

printf("Exiting main ...\n");
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\n",str);
for(i=0;i<5;i++)
reverse_str[5-i] = str[i];(逻辑出错的地方

,将reverse_str[5-i]改为reverse_str[4-i])
printf("%s\n",reverse_str);
return 0;
}
:wq
#make
#./reverse
hello
(空,出错的原因:单步调试在循环完成后,查看reverse_str的结

果,p reverse_str,结果是"\000olleh",而打印时以"\0"开头,所

以停止。
#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\n",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文件