1. gdb调试

Linux命令(十四)gdb调试_gdb调试

fun.c


#include <stdio.h>      #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; }


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\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命令(十四)gdb调试_#include_02

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

2 启动gdb

gdb app.out

Linux命令(十四)gdb调试_#include_03

2.1 run (r) 启动

Linux命令(十四)gdb调试_主函数_04

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

2.21 next(n):下一步

Linux命令(十四)gdb调试_#include_05

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

Linux命令(十四)gdb调试_修改文件_06

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

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

Linux命令(十四)gdb调试_修改文件_07

2.32 设置变量值


  • set argc=4
  • set argv[1]="12"

Linux命令(十四)gdb调试_#include_08

2.4 设置断点break (重要)

2.41 list查看代码

Linux命令(十四)gdb调试_gdb调试_09

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

Linux命令(十四)gdb调试_主函数_10

Linux命令(十四)gdb调试_#include_11

2.43 b 函数名

Linux命令(十四)gdb调试_#include_12

2.44 b 文件名:行号

Linux命令(十四)gdb调试_gdb调试_13

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

Linux命令(十四)gdb调试_gdb调试_14

2.46 info b--显示全部断点

Linux命令(十四)gdb调试_修改文件_15

2.5 删除断点 del (d)

Linux命令(十四)gdb调试_主函数_16

2.6 运行至下个断点 c

Linux命令(十四)gdb调试_gdb调试_17

2.7 p 变量--打印变量

Linux命令(十四)gdb调试_文件名_18

2.8 ptype--查看类型

Linux命令(十四)gdb调试_#include_19

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

2.91 display 变量

Linux命令(十四)gdb调试_文件名_20

2.92 undisplay 行号

Linux命令(十四)gdb调试_#include_21

3. 补充

3.1 设置条件断点

Linux命令(十四)gdb调试_修改文件_22

Linux命令(十四)gdb调试_gdb调试_23

Linux命令(十四)gdb调试_修改文件_24

4. gdb跟踪core

Linux命令(十四)gdb调试_文件名_25

Linux命令(十四)gdb调试_文件名_26

Linux命令(十四)gdb调试_#include_27

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

4.1 设置生成core:ulimit -c unlimited

Linux命令(十四)gdb调试_修改文件_28

Linux命令(十四)gdb调试_修改文件_29

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