Linux C编程----3(gdb调试)
2015-12-15 19:36
501 查看
一、常用命令
break(b):
break func:在函数开始设置断点,进入函数时停止运行
break num:在第num行设置断点
b reak:没有参数表示在下一条指令停止
delete break:删除断点
breaktrace(bt):查看各级函数调用及参数
call func:强制调用函数
continue(c):当程序遇到断点停止后,可继续运行直至下一个断点
continue count:忽略后面的count个断点
display:
display var:实时打印变量数值
examine(x):查看内存地址中的值
finish:运行程序,直到当前函数完成
frame(f):选择栈桢
info(i):查看寄存器、断点、观察点和信号等信息
jump:
jump num:程序跳到num运行
jump +ofst:偏移量格式地跳转
list(l):
list num:列出第num行周围的源程序
list func:列出函数func周围的程序
list :可看当前行后面的程序
list-:可看当前行前面的程序
next(n):单步执行,遇到函数时,不进入函数
next count:执行后面的count条指令
print(p):
print var:打印出var变量的值
print *(addr)=val:修改值
quit(q):退出调试
return:如果在函数中设置了高度断点,在断点后还有语句未执行,可强制返回
return expr:带参数返回,作为函数的返回值
run:启动程序
set:修改寄存器、内存、变量的值
signal:可以产生一个信号量给被调试的程序
start:开始执行程序,在main函数变量定义之后的第一行语句前面等待命令
step(s):单步执行,遇到函数则进入函数执行
step count:执行后面的count条指令后停止
watch:用来观察某个表达式的值是否有变化,如果有变化则马上停止程序
二、一个例子
首先源程序如下:
break(b):
break func:在函数开始设置断点,进入函数时停止运行
break num:在第num行设置断点
b reak:没有参数表示在下一条指令停止
delete break:删除断点
breaktrace(bt):查看各级函数调用及参数
call func:强制调用函数
continue(c):当程序遇到断点停止后,可继续运行直至下一个断点
continue count:忽略后面的count个断点
display:
display var:实时打印变量数值
examine(x):查看内存地址中的值
finish:运行程序,直到当前函数完成
frame(f):选择栈桢
info(i):查看寄存器、断点、观察点和信号等信息
jump:
jump num:程序跳到num运行
jump +ofst:偏移量格式地跳转
list(l):
list num:列出第num行周围的源程序
list func:列出函数func周围的程序
list :可看当前行后面的程序
list-:可看当前行前面的程序
next(n):单步执行,遇到函数时,不进入函数
next count:执行后面的count条指令
print(p):
print var:打印出var变量的值
print *(addr)=val:修改值
quit(q):退出调试
return:如果在函数中设置了高度断点,在断点后还有语句未执行,可强制返回
return expr:带参数返回,作为函数的返回值
run:启动程序
set:修改寄存器、内存、变量的值
signal:可以产生一个信号量给被调试的程序
start:开始执行程序,在main函数变量定义之后的第一行语句前面等待命令
step(s):单步执行,遇到函数则进入函数执行
step count:执行后面的count条指令后停止
watch:用来观察某个表达式的值是否有变化,如果有变化则马上停止程序
二、一个例子
首先源程序如下:
test.c #include <stdio.h> int add_range(int low, int high) { int i = 0; int sum = 0; for(i=low; i<=high, i++) { sum = sum + i; } return sum; } int main() { int result[100]; char* c = "hello world"; printf("%s\n", c); result[0] = add_range(1, 100); return 0; }
编辑完保存,并编译 gcc -g test.c -o test -g选项是在可执行文件里加入源程序信息以供调试 接着开始进行调试 gdb test
GNU gdb (GDB) 7.1-ubuntu Copyright (C) 2010 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 "i486-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/ding/workdir/gary/test/12-14-2/test...done. (gdb)
这就进入了调试界面,第一部分的命令就是在这里使用: 列出第1行开始的源程序:
(gdb) list 1 warning: Source file is more recent than executable. 1 #include <stdio.h> 2 3 int add_range(int low, int high) 4 { 5 int i = 0; 6 int sum = 0; 7 8 for(i = low; i <= high; i++) 9 { 10 sum = sum + i; (gdb) 11 } 12 13 return sum; 14 } 15 16 int main() 17 { 18 int result[100]; 19 char* c = "hello world"; 20 (gdb)
可以看到每次列出10行,后面10行直接按回车即可
(gdb) start Temporary breakpoint 1 at 0x8048453: file test.c, line 19. Starting program: /home/ding/workdir/gary/test/12-14-2/test Temporary breakpoint 1, main () at test.c:19 19 char* c = "hello world"; (gdb)
输入start命令后,在定义语句之后的第一个命令处停止运行,此时输入step或next可执行下一条指令
(gdb) n 21 printf("%s\n", c); (gdb)
如果这个时候要看main函数里的变量的值,可用info locals命令
(gdb) info locals result = {1163338, 1228788, 0, 0, -1073744716, 1201216, 1217633, 1214780, 1230116, 0, 1115284, -1073744716, 1115666, -1073744684, 1114836, 2, 1114932, 1287844, 225011984, -1073744688, 1149478, 1312754, 134513279, 2, 134513224, -1207960760, -1073807358, 1172960, 134513224, 1231840, 1228788, 1252268, 1, -1073744548, 1150934, 1228788, -1073744384, 1126577, 1230116, 1231536, 0, 0, 0, 0, 1252788, 1214364, -1073744604, 1231848, 14, 1287844, -1207960804, -163754450, 0, 3, 1231096, 0, 0, 1, 2191, -1207960760, -1207961512, 134513261, 1289924, 134513144, 1, 1228788, -1073744320, 1231536, -1073744364, 1151570, -1073744380, 134513144, -1073744392, 1231444, 0, -1207960760, 1, 0, 1, 1231096, 2670580, 2337193, 1429557, -1073744472, 1329653, 2670580, 134520820, -1073744456, 134513420, 1171584, 134520820, -1073744408, 134513913, 2671396, 2670580, 134513888, -1073744408, 1430069, 1171584, 134513899} c = 0x8048590 "hello world" (gdb)
可以看到result数组的值都很奇怪,因为我们还没给它赋值,但c是“hello world”,这里能看到c的地址是0x8048590,此时可以根据这个地址给修改c的值
(gdb) print *(char*)0x8048590='H' $1 = 72 'H' (gdb) print c $2 = 0x8048590 "Hello world" (gdb)
可以看到c的第一个字母变面了大写的H,那如果要改result的值呢
(gdb) print result[0]=0 $3 = 0 (gdb) print result[0] $4 = 0 (gdb)
也可以通过地址来修改:
(gdb) print &result[1] $5 = (int *) 0xbffff450 (gdb) print *(int*)0xbffff450=1 $6 = 1 (gdb) print result[1] $7 = 1
好了,继续往下走
(gdb) step Hello world 22 result[0] = add_range(1, 10); (gdb) s add_range (low=1, high=10) at test.c:5 5 int i = 0; (gdb)
用step命令进入add_range函数,可以用display实时打印出这个函数里的变量的值
(gdb) display i,sum 1: i,sum = 0 (gdb) s 6 int sum = 0; 1: i,sum = 0 (gdb) 8 for(i = low; i <= high; i++) 1: i,sum = 0 (gdb) 10 sum = sum + i; 1: i,sum = 0 (gdb) 8 for(i = low; i <= high; i++) 1: i,sum = 1 (gdb)
此时可以用finish命令执行完本函数 最后就是用quit命令结束调试
相关文章推荐
- linux中与test命令相同功能的[] __demo
- Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题
- CentOS开机自动运行程序的脚本
- CentOS开机自动运行程序的脚本
- Linux下启动和关闭mysql服务
- Linux下rz/sz安装及使用方法
- 【window10下硬盘安装双系统linux之ubuntu14.04】
- dd制作linux启动盘
- linux 局域网内文件传送
- Linux查看网卡流量(转)
- linux产生随机数
- Linux下DG环境的搭建及升级(step by step)
- Linux内核构造数据包并发送(Netfilter方式)
- 为Debian 8 的iceweasel浏览器安装flash player
- Linux Top 命令解析 比较详细(转)
- Linux添加/删除用户和用户组
- lINUX例行性计划任务
- Linux-CentOS 安装配置ExifTool
- 老李分享:《Linux Shell脚本攻略》 要点(四)
- centos 开启防火墙