免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1102 | 回复: 0
打印 上一主题 下一主题

Linux下常用开发工具-GDB [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-19 17:26 |只看该作者 |倒序浏览
2 GDB
2.1 设置和清除程序停止点 a 设置断点
break
break
break ... if
b 设置观察点(WatchPoint)
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变
化了,如果有变化,马上停住程序。
watch
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch
当表达式(变量)expr被读时,停住程序。
awatch
当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
列出当前所设置了的所有观察点。
c 设置捕捉点(CatchPoint)
你可设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动
态链接库)或是C++的异常。设置捕捉点的格式为:
catch
当event发生时,停住程序。event可以是下面的内容:
1、throw 一个C++抛出的异常。(throw为关键字)
2、catch 一个C++捕捉到的异常。(catch为关键字)
3、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
4、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
5、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
6、load 或 load  载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
7、unload 或 unload  卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)
clear
d 清除所有的已定义的停止点。
delete [breakpoints] [range...]
disable [breakpoints] [range...]
disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis.
enable [breakpoints] [range...]
enable所指定的停止点,breakpoints为停止点号。
enable [breakpoints] once range...
enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。
enable [breakpoints] delete range...
enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。
e 停止条件维护
condition  
修改断点号为bnum的停止条件为expression。
condition
清除断点号为bnum的停止条件。
2.2 恢复程序运行和单步调试
当程序被停住了,你可以用continue命令恢复程序的运行直到程序结
束,或下一个断点到来。也可以使用step或next命令单步跟踪程序。
continue [ignore-count]
c [ignore-count]
fg [ignore-count]
恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count
表示忽略其后的断点次数。continue,c,fg三个命令都是一样的意
思。
step  
单步跟踪,如果有函数调用,他会进入该函数。进入
函数的前提是,此函数被编译有debug信息。很像VC等工具中的step
in。后面可以加count也可以不加,不加表示一条条地执行,加表示
执行后面的count条指令,然后再停住。
next  
同样单步跟踪,如果有函数调用,他不会进入该函数
。很像VC等工具中的step over。后面可以加count也可以不加,不加
表示一条条地执行,加表示执行后面的count条指令,然后再停住。
finish
运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。
until 或 u
当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
stepi 或 si
nexti 或 ni
单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,
stepi和nexti可以单步执行机器指令。与之一样有相同功能的命令是
“display/i $pc” ,当运行完这个命令后,单步跟踪会在打出程序
代码的同时打出机器指令(也就是汇编代码)
2.3 查看当前数据
bt
打印当前的函数调用栈的所有信息
info f
这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是
运行时的内内地址。比如:函数地址,调用函数的地址,被调用函数
的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及
值、局部变量的地址等等。如:
disassemble 可以查看源程序的当前执行时的机器码,这个命令会把目前内存中的指令dump出来。
disassemble func
在你调试程序时,当程序被停住时,你可以使用print命
令(简写命令为p),或是同义命令inspect来查看当前程序的运行数
据。print命令的格式是:
print
print /
有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或
是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的
左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长
度。例如:
int *array = (int *) malloc (len * sizeof (int));
可以用如下命令显示出这个动态数组的取值:
p *array@len
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
x 打印内存
x/
n、f、u是可选的参数。
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4
  个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双
  字节,w表示四字节,g表示八字节。当我们指定了字节长度后,
  GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一
  个值取出来。
表示一个内存地址。
n/f/u三个参数可以一起使用。例如:
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以
双字节为一个单位,3表示三个单位,u表示按十六进制显示。
2.4 产生信号量
使用singal命令,可以产生一个信号量给被调试的程序。如:中断信
号Ctrl+C。这非常方便于程序的调试,可以在程序运行的任意位置
设置断点,并在该断点用GDB产生一个信号量,这种精确地在某处产
生信号非常有利程序的调试。
语法是:signal ,UNIX的系统信号量通常从1到15。所以取值也在这个范围。
single命令和shell的kill命令不同,系统的kill命令发信号给被调
试程序时,是由GDB截获的,而single命令所发出一信号则是直接发
给被调试程序的。
2.5 使用gdbserverDebug运行中的可执行程序(如一个daemon程序)
target:
/tmp # gdbserver :8900 --attach 1112
host:
[sbox-alp-x86-dbg-dev: /opt/alp/bin] > gdb mediacatd
(gdb) target remote 192.168.3.101:8900
2.6 配置相关symbol-file [ filename ]
读取sysmbol表
add-symbol-file filename address
增加sysmbol表
info share
    Print the names of the shared libraries which are currently loaded.
set solib-search-path path
    If this variable is set, path is a colon-separated list of directories to search for shared libraries.调试共享库时使用。
maint info sections
    Another command that can give you extra information about program sections
directory
dir
加一个源文件路径到当前路径的前面。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/60303/showart_2098674.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP