Linux笔记 程序调试gdb

来源:互联网 发布:oracle数据库代理商 编辑:程序博客网 时间:2024/06/09 16:51

1 调试准备
首先新建test1.c文件。

  1 #include <stdio.h>                                                                                   2 #include <stdlib.h>  3 #include <unistd.h>  4   5 int myfun(int a){  6         int i = 0;  7         int* buff = (int*)malloc(sizeof(int)*100);  8         while(i<100){  9                 buff[i] = a; 10                 a+=i; 11                 i++; 12         } 13         free(buff); 14         return a/2; 15 } 16  17 void main(){ 18         printf("begin...\n"); 19         int num = 0; 20         if(num > 10){ 21              printf("%d>10\n",num); 22         }else{ 23                  printf("%d<=10\n",num); 24         } 25  26         int i; 27         for(i=0;i<5;i++){ 28                 printf("i:%d\n",i); 29                 num+=i; 30         } 31         myfun(&num); 32  33         printf("end...\n"); 34 }

然后使用命令

gcc test1.c -g -o test1

将会看到生成了可执行文件test1

root@iZ2zea2ti45wm5djtomfm5Z:/usr/yeliang/linux# lscore  test1  test1.c  test2  test2.c

使用gdb调试test1
gdb test1

root@iZ2zea2ti45wm5djtomfm5Z:/usr/yeliang/linux# gdb test1GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1Copyright (C) 2014 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.  Type "show copying"and "show warranty" for details.This GDB was configured as "x86_64-linux-gnu".Type "show configuration" for configuration details.For bug reporting instructions, please see:<http://www.gnu.org/software/gdb/bugs/>.Find the GDB manual and other documentation resources online at:<http://www.gnu.org/software/gdb/documentation/>.For help, type "help".Type "apropos word" to search for commands related to "word"...Reading symbols from test1...done.

开始调试
start

(gdb) startTemporary breakpoint 1 at 0x40067a: file test1.c, line 18.Starting program: /usr/yeliang/linux/test1 Temporary breakpoint 1, main () at test1.c:1818      printf("begin...\n");

2 list命令显示代码
list简写l
显示main()前后的代码

(gdb) list13      free(buff);14      return a/2;15  }16  17  void main(){18      printf("begin...\n");19      int num = 0;20      if(num > 10){21           printf("%d>10\n",num);22      }else{

可以继续向下查看

(gdb) list19        int num = 0;20        if(num > 10){21             printf("%d>10\n",num);22        }else{23             printf("%d<=10\n",num);24        }25   26        int i;27        for(i=0;i<5;i++){28            printf("i:%d\n",i);(gdb) l29            num+=i;30        }31        myfun(&num);32   33        printf("end...\n");34    }

3 执行下一步 next
next 简写是n 。可以直接按回车,执行上一次命令

(gdb) nbegin...19      int num = 0;(gdb) 20      if(num > 10){(gdb) n23           printf("%d<=10\n",num);(gdb) n0<=1027      for(i=0;i<5;i++){

4 查看某一个函数内容list+函数名称

(gdb) list myfun1   #include <stdio.h>2   #include <stdlib.h>3   #include <unistd.h>4   5   int myfun(int a){6       int i = 0;7       int* buff = (int*)malloc(sizeof(int)*100);8       while(i<100){9           buff[i] = a;10          a+=i;

5 查看某一行地代码list+行数

(gdb) list 105   int myfun(int a){6       int i = 0;7       int* buff = (int*)malloc(sizeof(int)*100);8       while(i<100){9           buff[i] = a;10          a+=i;11          i++;12      }13      free(buff);14      return a/2;

6 查看变量 print+变量名字

27        for(i=0;i<5;i++){(gdb)28            printf("i:%d\n",i);(gdb)i:129            num+=i;(gdb)27        for(i=0;i<5;i++){(gdb)28            printf("i:%d\n",i);(gdb) print i$1 = 2

7 step进入某个函数 简写s

31        myfun(&num);(gdb) stepmyfun (a=-6776) at test1.c:66        int i = 0;

第六行是函数的的第一行

5    int myfun(int a){6        int i = 0;7        int* buff = (int*)malloc(sizeof(int)*100);8        while(i<100){

8 设置断点 break+行号(gdb中的行号)- 简写b

(gdb) break 31Breakpoint 6 at 0x4006ef: file test1.c, line 31.

9 查看有哪些断点 info breakpoint

(gdb) info breakpointNum     Type           Disp Enb Address            What6       breakpoint     keep y   0x00000000004006ef in main at test1.c:31

10 跳转到下个断点 continue简写c

(gdb) continueContinuing.i:1i:2i:3i:4Breakpoint 6, main () at test1.c:3131        myfun(&num);

11 删除断点 delete breakpoints+行号

31        myfun(&num);(gdb) i breakpointNum     Type           Disp Enb Address            What2       breakpoint     keep y   0x00000000004006ef in main at test1.c:31    breakpoint already hit 1 time3       breakpoint     keep y   0x00000000004006fa in main at test1.c:33(gdb) delete breakpoints 3(gdb) cContinuing.end...

12 修改变量的值 set var 变量 = 值

(gdb) nbegin...19        int num = 0;(gdb)  set var num = 20(gdb) p num$1 = 20

13 程序调用堆栈
当前函数之前所有函数的列表打印出来 backtrace简写bt 每一个函数都会分配一个“帧” 最近的在0号帧

31        myfun(&num);(gdb) stepmyfun (a=-6776) at test1.c:66        int i = 0;(gdb) bt#0  myfun (a=-6776) at test1.c:6#1  0x00000000004006fa in main () at test1.c:31

可以看到myfun()方法在0帧 main()方法在第一帧

14 切换栈帧 frame 1 查看指定栈帧的变量

(gdb) frame 1#1  0x00000000004006fa in main () at test1.c:3131        myfun(&num);(gdb) list26        int i;27        for(i=0;i<5;i++){28            printf("i:%d\n",i);29            num+=i;30        }31        myfun(&num);32   33        printf("end...\n");34    }(gdb) p num$2 = 10

15 自动显示 display+变量名称

(gdb) display a2: a = -6776(gdb)(gdb)(gdb) n11            i++;2: a = -67751: i = 1

每次执行下一步都会显示变量a的值,也可以自动显示多个值。display a然后在display b。

16 取消自动显示 undisplay+行号

2: a = -67731: i = 3(gdb) undisplay 8No display number 8.(gdb) undisplay 2(gdb) n9            buff[i] = a;1: i = 3(gdb)10            a+=i;1: i = 3(gdb)11            i++;1: i = 3(gdb)

17 查看内存布局
x /20+地址 x/20 buff查看buff数组的前20个元素
首先切换到myfun方法中

(gdb) stepmyfun (a=-6776) at test1.c:66       int i = 0;(gdb) n7       int* buff = (int*)malloc(sizeof(int)*100);(gdb) 8       while(i<100){(gdb) 9           buff[i] = a;(gdb) 10          a+=i;(gdb) 11          i++;

buff数组已经被赋值,然后查看buff数组的前20个元素

(gdb) x/20 buff0x602010:   -6776   0   0   00x602020:   0   0   0   00x602030:   0   0   0   00x602040:   0   0   0   00x602050:   0   0   0   0