• 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调试逻辑错误

    //演示样例-实现逆序输出字符串hello。可是却没有不论什么输出
    #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]; 	
    //Error:应该是reverse_str[4-i]...
    
            printf("%s
    ", reverse_str);
            return 0;
    }



    gdb调试段错误

    段错误是因为訪问非法地址而产生的错误。

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

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

    //演示样例
    #include <stdio.h> 
    #include <stdlib.h> 
    
    void segfault1()
    { 
    	int *p = NULL; 
    	*p = 100; 
    } 
    
    void segfault2() 
    { 
    	char buf[1] = "a"; 
    	buf[13] = 'A'; 
    	printf("%c
    ",buf[13]); 
    } 
    
    void segfault3()
    { 
    	char buf[1] = "a"; 
    	buf[10] = 'A'; 
    	printf("%c
    ",buf[10]); 
    } 
    
    
    int main() 
    { 
    	segfault1(); 
    //	segfault2(); 
    //	segfault3(); 
    
    	return 0; 
    } 

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

     


    wh命令查看程序代码窗体

     

     

    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



  • 相关阅读:
    python day1
    Vue与react的择决
    CommonJS规范
    js面向对象的程序设计
    正则匹配所有的a标签
    js-静态、原型、实例属性
    js中参数不对应问题
    sublime常用快捷键
    JSON.parse()和JSON.stringify()
    setAttribute()
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6748763.html
Copyright © 2020-2023  润新知