Linux C/C++编程之(十一)gdb调试

文章目录

    • 一、概述
    • 二、使用场景
    • 三、gdb调试
    • 四、gdb详解
      • 1. 简介
      • 2. 生成调试信息
      • 3. 启动GDB 的方法
      • 4. 程序运行上下文
      • 5. 调试代码
      • 6. 设置断点
      • 7. 查看运行时数据
      • 8. 自动显示
    • 五、GDB基本命令总结

一、概述

Linux C/C++编程之(十一)gdb调试_第1张图片

二、使用场景

使用场景el-

  • 程序编译无误,但是有逻辑错误
  • 使用文字终端(shell),实现一个单步调试的功能
  • 生成可执行文件之前必须加参数-g
gcc hello.c -o hello -g

三、gdb调试

  • gdb + 可执行文件(如:gdb hello)启动gdb调试
  • I(list)–>列出文件的代码清单
    • l + 行号(132)–>代码从第32行开始显示
  • b(break)–>设置断点
    • b + 行号(b12)–>在第12行设置断点
    • b + 行号(2)+ 条件(if i = 5)–> 在第2行设置断点,只有 i 等于5时生效
  • info b(break)–>查看断点信息
  • r(run)–>运行程序
  • start -->单步执行,运行程序,停在第一行执行语句
  • disable/enable + 断点号 -->设置断点是否有效
  • d(delete)+ 断点号 -->删除指定断点号对应的断点
  • p(print)+ 变量名 -->打印变量值
  • display + 变量名 -->追踪变量
    • 之后每执行一步,该变量值都会被打印出来
  • undisplay + 变量名编号 -->取消跟踪
  • n(next)–>下一行(不会进入到函数体内部)
  • s(step)–>下一步(会进入到函数体内部)
  • ptyte + 变量名 -->查看变量的类型
  • finish -->结束当前函数,返回到函数调用点
  • set -->设置变量的值 set var n=100
  • q(quit)–>退出gdb

四、gdb详解

1. 简介

Linux C/C++编程之(十一)gdb调试_第2张图片
GDB(GNU Debugger)是GCC的调试工具。其功能强大,主要帮忙完成下面四个方面的功能:

1)启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2)可让被调试的程序在你所指定的调置的断点处停住(断点可以是条件表达式)。

3)当程序被停住时,可以检查此时你的程序中所发生的事。

4)动态地改变你程序的执行环境。

2. 生成调试信息

一般来说GDB主要调试的是C/C++的程序。
Linux C/C++编程之(十一)gdb调试_第3张图片
要调试C/C++的程序,首先在编译时必须要把调试信息加到可执行文件中。

//fun.c

#include      
#include "head.h"      

int sum(int a, int b)  
{ 
    printf("welcome call %s, %d + %d = %d\n",__FUNCTION__, a, b, a + b);
    return a + b;      
}
 
int mul(int a, int b)
{
    printf("welcome call %s, %d * %d = %d\n", __FUNCTION__, a, b, a * b);
    return a * b;
}

Linux C/C++编程之(十一)gdb调试_第4张图片

//head.h

#include      
                       
int sum(int a, int b); 
int mul(int a, int b);

Linux C/C++编程之(十一)gdb调试_第5张图片
//main.c

#include      
#include     
#include     
#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\n", i, __LINE__);
        if (i == 0)
        {
            funinfo[i].fun_type = 1;
            printf("begin call sum\n");
            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\n");
            strcpy(funinfo[i].funname, "mul");
            mul(funinfo[i].a, funinfo[i].b);
        }
    }

    printf("say bye\n");

    return 0;
}

Linux C/C++编程之(十一)gdb调试_第6张图片
Linux C/C++编程之(十一)gdb调试_第7张图片
使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。
Linux C/C++编程之(十一)gdb调试_第8张图片
如果没有 -g,将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。

当用 -g 把调试信息加入之后,并成功编译目标代码以后,就可以用gdb来调试了。

3. 启动GDB 的方法

gdb program,program 也就是你的执行文件,一般在当前目录下。
Linux C/C++编程之(十一)gdb调试_第9张图片

4. 程序运行上下文

1)程序运行参数

  • set args 可指定运行时参数。
  • show args 命令可以查看设置好的运行参数。
  • run 启动程序
    Linux C/C++编程之(十一)gdb调试_第10张图片

2)工作目录

  • cd 相当于shell的cd命令。
  • pwd 显示当前的所在目录。
    在这里插入图片描述

5. 调试代码

  • run 运行程序,可简写为r
    Linux C/C++编程之(十一)gdb调试_第11张图片
  • start 启动,停留在 main 函数,分步调试
    Linux C/C++编程之(十一)gdb调试_第12张图片
  • next 单步跟踪,函数调用当作一条简单语句执行,可简写为n
    Linux C/C++编程之(十一)gdb调试_第13张图片
  • step 单步跟踪,函数调进入被调用函数体内,可简写为s
    Linux C/C++编程之(十一)gdb调试_第14张图片
  • finish 退出进入的函数
    Linux C/C++编程之(十一)gdb调试_第15张图片
  • until 在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,可简写为u。
  • continue 继续运行程序,可简写为c

6. 设置断点

  • list查看代码
    Linux C/C++编程之(十一)gdb调试_第16张图片
  • b 行号–主函数所在文件的行
    Linux C/C++编程之(十一)gdb调试_第17张图片
  • b 函数名
    Linux C/C++编程之(十一)gdb调试_第18张图片
  • b 文件名:行号
    在这里插入图片描述
  • list 文件名:行号(默认10行)
    Linux C/C++编程之(十一)gdb调试_第19张图片
  • info b–显示全部断点
    在这里插入图片描述
  • 删除断点 del (d)
    在这里插入图片描述
  • 运行至下个断点 c
    Linux C/C++编程之(十一)gdb调试_第20张图片
  • 设置条件断点
    Linux C/C++编程之(十一)gdb调试_第21张图片

7. 查看运行时数据

  • print 打印变量、字符串、表达式等的值,可简写为p
    在这里插入图片描述
  • ptype 查看类型
    在这里插入图片描述

8. 自动显示

可以设置一些自动显示的变量,当程序停住时,或是在单步跟踪时,这些变量会自动显示。相关的GDB命令是display。

  • display 变量名
    Linux C/C++编程之(十一)gdb调试_第22张图片
  • info display – 查看display设置的自动显示的信息。
    在这里插入图片描述
  • undisplay num(info display时显示的编号)
    Linux C/C++编程之(十一)gdb调试_第23张图片
  • delete display dnums… – 删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示Linux C/C++编程之(十一)gdb调试_第24张图片

五、GDB基本命令总结

Linux C/C++编程之(十一)gdb调试_第25张图片
Linux C/C++编程之(十一)gdb调试_第26张图片
Linux C/C++编程之(十一)gdb调试_第27张图片

你可能感兴趣的:(Linux,C/C++编程笔记❤️)