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
阅读全文
0 0
- Linux笔记 程序调试gdb
- linux调试程序利器 GDB学习笔记
- linux GDB调试程序
- gdb 调试 linux程序
- Linux GDB调试++程序
- linux gdb调试程序
- linux gdb调试笔记
- 用GDB调试程序(笔记)
- GDB程序调试学习笔记
- Linux下gdb调试程序
- Linux下gdb调试程序
- gdb 调试linux c程序
- linux下gdb调试程序
- 【Linux学习】GDB程序调试
- linux GDB调试c++程序
- gdb调试linux可执行程序
- linux gdb调试程序 - 信号
- 【GDB】Linux下调试程序
- C/C++内存泄漏检测
- 微信jssdk领取卡券
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- 厉 害 了!'我的' TP5 !!!
- 多态的作用
- Linux笔记 程序调试gdb
- 微信小程序开发 | 来自小程序开发者的实例教程
- CSS 列表样式详解
- eclipse反编译
- 面试题37:两个链表的第一个公共结点
- 前后端框架
- Visual Studio 2012 编译错误【error C4996: 'scanf': This function or variable may be unsafe. 】的解决方案
- CentOS7 安装mysql 8.0
- Python010函数