首页 > 代码库 > GDB调试总结__1

GDB调试总结__1

该博客旨在分享IT技术心得和实际工作中遇到问题的解决方法,以下是新浪博客地址http://blog.sina.com.cn/qianyumolu,则为分享经济、行业趋势、心灵文章等,有兴趣的朋友可以踩踩,讨论分享    也欢迎来群里一起学习交流http://url.cn/LJhxoQ                                                 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

也欢迎来群里一起学习交流http://url.cn/LJhxoQ

 

我的GDB调试学习思路:

 

A、如何启动调试

1、源码级启动

2、已运行程序启动

B、如何设置断点、观察点

C、如何打印相关变量

D、切换线程

E、动态的改动你程式的执行环境

 

 

 

正文

GDB概述 


GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那
种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你
会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,
尺有所短”就是这个道理。 


一般来说,GDB主要帮忙你完成下面四个方面的功能: 
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 
3、当程序被停住时,可以检查此时你的程序中所发生的事。 
4、动态的改变你程序的执行环境。 

 

 

A、如何启动调试

 

 

启动GDB的方法有以下几种:

 

1、gdb program  

program 也就是你的执行文件,一般在当前目录下。 

 

2、gdb program core  

用gdb同时调试一个运行程式和core文件,core是程式非法执行后core dump后产生的文件。 

 

3、gdb   program ID  

如果你的程式是个服务程式,那么你能指定这个服务程式运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

 

 
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下
面只例举一些比较常用的参数: 
-symbols 
-s 
从指定文件中读取符号表。 
-se file 
从指定文件中读取符号表信息,并把他用在可执行文件中。 
-core 
-c 
调试时core dump的core文件。 
-directory 
-d 
加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。 

 

 

在GDB中运行程序 
———————— 
当以gdb 方式启动gdb后,gdb会在PATH路径和当前目录中搜索的源文件。如要确认gdb
是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。 
在gdb中,运行程序使用r或是run命令。程序的运行,你有可能需要设置下面四方面的事。 
1、程序运行参数。 
set args 可指定运行时参数。(如:set args 10 20 30 40 50) 
show args 命令可以查看设置好的运行参数。 
2、运行环境。 
path 
可设定程序的运行路径。 
show paths 查看程序的运行路径。

setenvironment varname [=value] 设置环境变量。如:set envUSER=hchen 
show environment [varname] 查看环境变量。 
3、工作目录。 
cd 
相当于shell的cd命令。 
pwd 显示当前的所在目录。 
4、程序的输入输出。 
info terminal 显示你程序用到的终端的模式。 
使用重定向控制程序输出。如:run > outfile 
tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb 
调试已运行的程序 
————————  

 

 

B、设置断点、观察点

 

1、设置断点

 

b + 断点 -》设置调试的断点。

两种:

一种是:b CMSTask.cpp:200 

表示在CMSTask.cpp文件的第200行设置断点 。 

           
另一种:b TaskManager::buildPubWinTask 

表示在执行buildPubWinTask这个函数的时候停止。 

 

取消断点: 

  dis 1 表示取消第一个断点  

  dis 2 表示取消第二个断点  

 

查看设置断点信息: info b 

 

 

2、设置观察点(WatchPoint) 
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马
上停住程序。我们有下面的几种方法来设置观察点: 
watch 
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。 
rwatch 
当表达式(变量)expr被读时,停住程序。 
awatch 
当表达式(变量)的值被读或被写时,停住程序。

infowatchpoints 
列出当前所设置了的所有观察点。 

 

设置捕捉点(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下有用) 
tcatch 
只设置一次捕捉点,当程序停住以后,应点被自动删除。