[置顶] gdb学习(二)



查看运行时数据

print - 查看变量值

 

ptype – 查看变量类型

#ptype i

#ptype “aaa” 打印字符串”aaa”的类型

#ptype array 打印数组array的类型

#ptype main 打印main函数的类型

 

print array – 查看数组

#p arr1

#p arr1[2] 查看数组arr2第三个元素值

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

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

 

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

#p *arr2@10 

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

#p *arr@10 #静态的数组也可以改方式打印

#p arr[2]@2 #从arr[2]开始的两个元素

#p arr@2 #打印两个数组

 

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

#print i = 1000

 

程序错误

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

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

逻辑错误:编译和运行都很顺利,但是执行结果不对

 

gdb调试逻辑错误

[cpp] view plain copy print ?
  1. //示例-实现逆序输出字符串hello,但是却没有任何输出  
  2. #include <stdio.h>  
  3. int main(void)  
  4. {  
  5.         int i;    
  6.         char str[6] = "hello";  
  7.         char reverse_str[6] = "";  
  8.   
  9.         printf("%s\n", str);  
  10.         for (i=0; i<5; i++)  
  11.                 reverse_str[5-i] = str[i];    
  12. //Error:应该是reverse_str[4-i]...  
  13.   
  14.         printf("%s\n", reverse_str);  
  15.         return 0;  
  16. }  



gdb调试段错误

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

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

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

[cpp] view plain copy print ?
  1. //示例  
  2. #include <stdio.h>   
  3. #include <stdlib.h>   
  4.   
  5. void segfault1()  
  6. {   
  7.     int *p = NULL;   
  8.     *p = 100;   
  9. }   
  10.   
  11. void segfault2()   
  12. {   
  13.     char buf[1] = "a";   
  14.     buf[13] = 'A';   
  15.     printf("%c\n",buf[13]);   
  16. }   
  17.   
  18. void segfault3()  
  19. {   
  20.     char buf[1] = "a";   
  21.     buf[10] = 'A';   
  22.     printf("%c\n",buf[10]);   
  23. }   
  24.   
  25.   
  26. int main()   
  27. {   
  28.     segfault1();   
  29. //  segfault2();   
  30. //  segfault3();   
  31.   
  32.     return 0;   
  33. }   

where命令 or bt命令:栈回溯,显示导致段错误的执行函数树

 [置顶] gdb学习(二)_第1张图片


wh命令查看程序代码窗口

 [置顶] gdb学习(二)_第2张图片

 

core文件调试

1、core文件

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

 

2、设置生成core文件

ulimit -c   #查看core-dump状态

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

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

 

将ulimit -c unlimited写入~/.bashrc,则默认会生成core文件

 

3、gdb利用core文件调试

gdb 程序名 [core-file] #如:gdb bugging core


转载  http://blog.csdn.net/zjf280441589/article/details/40024413

如有版权问题,请联系QQ:858668791

你可能感兴趣的:(ubuntu,gdb,调试)