zoukankan      html  css  js  c++  java
  • Linux命令(十四)gdb调试

    1. gdb调试

    fun.c

    #include <stdio.h>     
    #include "head.h"      
    
    
    int sum(int a, int b)  
    { 
        printf("welcome call %s, %d + %d = %d
    ",__FUNCTION__, a, b, a + b);
        return a + b;      
    }
     
    int mul(int a, int b)
    {
        printf("welcome call %s, %d * %d = %d
    ", __FUNCTION__, a, b, a * b);
        return a * b;
    }

    head.h

    #include <stdio.h>     
                           
    int sum(int a, int b); 
    
    int mul(int a, int b);

    main.c

    #include <stdio.h>     
    #include <string.h>    
    #include <stdlib.h>    
    #include "head.h"
    
    typedef struct MyfunInfo 
    { 
        int fun_type;           // 函数类型
        int a;                  // 函数的第一个参数     
        int b;                  // 第二个参数           
        char funname[10];       // 函数名称
    }MyfunInfo;
    
    int main(int argc, char *argv[])
    {
        int a = 2;
        int i = 0;
        int a1 = 10, b1 = 5;    
        MyfunInfo funinfo[2];   
        char *Msg = "I will die !";
        //Msg[0] = '1';
        if (argc == 3)
        {
            a1 = atoi(argv[1]);     
            b1 = atoi(argv[2]);     
            funinfo[0].a = a1;      
            funinfo[0].b = b1;      
            funinfo[1].a = a1;      
            funinfo[1].b = b1;      
        }
    
        for (int i = 0; i < 2; i++)
        {
            printf("i===%d, LINE=%d
    ", i, __LINE__);
            if (i == 0)
            {
                funinfo[i].fun_type = 1;
                printf("begin call sum
    ");
                strcpy(funinfo[i].funname, "sum");
                sum(funinfo[i].a, funinfo[i].b);
            }
            if (i == 1)
            {
                funinfo[i].fun_type = 2;   //call mul
                printf("begin call mul
    ");
                strcpy(funinfo[i].funname, "mul");
                mul(funinfo[i].a, funinfo[i].b);
            }
        }
    
        printf("say bye
    ");
    
        return 0;
    }

    (-g是调试选项, 生成的app.out可调试)

    2 启动gdb

    gdb app.out

    2.1 run (r) 启动

    2.2 start 启动-停留在main函数,分步调试

    2.21 next(n):下一步

    2.22 step(s):下一步, 可以进入函数内部, 但是库函数不能进

    2.3 设置启动参数和设置变量值 set args parm1 parm2 ...

    2.31 设置启动参数  set args parm1 parm2.....

    2.32 设置变量值

    • set argc=4

    • set argv[1]="12"

    2.4 设置断点break (重要) 

    2.41 list查看代码

    2.42 b 行号--主函数所在文件的行

    2.43 b 函数名

    2.44 b 文件名:行号

    2.45 list 文件名:行号(默认10行)

     

    2.46 info b--显示全部断点 

    2.5 删除断点 del (d)

    2.6 运行至下个断点 c

    2.7 p 变量--打印变量

    2.8 ptype--查看类型

    2.9 display 变量--用于追踪,查看变量具体何时变化

    2.91 display 变量

    2.92 undisplay 行号

     

    3. 补充

    3.1 设置条件断点

    4. gdb跟踪core

    注意:出现 段错误(核心已转储))

    4.1 设置生成core:ulimit -c unlimited

     

    4.2 取消生成core:ulimit -c 0

    4.3 设置core文件格式:/proc/sys/kernel/core_pattern

    • 设置core
    • 使用该命令修改文件(无法用vim): sudo echo "core-%e-%t" > /proc/sys/kernel/core_pattern 

     

  • 相关阅读:
    论url
    jquery send(data) 对data的处理
    jquery ajax 对异步队列defer与XMLHttprequest.onload的依赖
    requirejs解决异步模块加载方案
    vue 解决display与 transition冲突
    node exports与 module.exports的区别
    node js 模块分类
    写在入职初期
    入职前要学习的一些知识
    论文实验 云平台压力测试及服务器性能测试
  • 原文地址:https://www.cnblogs.com/douzujun/p/10584308.html
Copyright © 2011-2022 走看看