Linux开发工具

--gdb入门()

八、查看运行时数据

print-查看变量值

ptype–查看变量类型

#ptype i

#ptype “aaa”

#ptype arr1      打印数组arr1的类型



print array –查看数组

#p arr1

#p arr1[2]

#p &arr1[2]    打印数组元素的地址

#p &arr1        打印数组首地址,与p&arr1[0]作用相同



print *array@len –查看动态内存

#p *arr2@10

#p *arr2@15       #将数组越界之后的内存也打印出来了

#p arr[2]@2



print x=5 –动态改变运行时数据

#print  i = 1000



九、程序错误

编译错误:编写程序的时候没有符合语言规范导致编译错误【语法错误】。

运行时错误:编译器检查不出这种错误,但在运行的时候可能会导致程序崩溃【如:地址非法访问】。

逻辑错误:编译和运行都很顺利,但是程序没有干它该干的事情。



十、gdb调试逻辑错误

示例:

#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[4-i]...         printf("%s\n", reverse_str);         return 0; } //这个程序要实现逆序输出字符串hello,但是却没有任何输出。

十一、gdb调试段错误

段错误是由于访问非法地址而产生的错误。

        1、访问系统数据区,尤其是往系统保护的内存地址写数据。最常见就是给一个0地址指针赋值

        2、内存越界(数组越界,变量类型不一致等)访问到不属于你的内存区域

示例:

#include <stdio.h>  #include <stdlib.h>   void segfault()  {  	int *p = NULL;  	*p = 100;  }   void segfault2()  {  	char buf[1] = "a";  	buf[13] = 'A';  	printf("%c\n",buf[13]);  }   int main()  {  	segfault();  //	segfault2();  	return 0;  }  // bt命令		#栈回溯 

十二、core文件调试

1core文件

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

2、设置生成core文件

ulimit -c #查看core-dump状态

ulimit -c 数字 (如:ulimit-c 1024

ulimit -c unlimited

ulimit -a  #用于查看当前所有状态信息

3gdb利用core文件调试

gdb 文件名 core文件 #如:gdbbugging core

bt #栈回溯