02-gdb进阶_程序汪赵可乐的博客-爱代码爱编程
上篇文章已经认识了GDB调试工具的简单使用方法,已满足日常的使用需求。本文重点介绍GDB进阶内容中的运行程序、暂停程序。
运行程序
在gdb中,运行程序使用r或run即可运行程序,但有可能会需要有以下四个方面设置的需求:
-
程序运行参数
set args #指定运行时参数 show args #查看设置好的运行参数
-
运行环境
path <dir> # 可设定程序的运行路径 show paths # 查看程序的运行环境 set environment varname[=value] # 设置环境变量 show enviroment [varname] #查看环境变量
-
工作目录
cd <dir> #相当于shell的 cd 命令 pwd #显示当前所在目录
-
程序的输入输出
info terminal #显示你程序用到的终端模式 run > file #控制程序输出到文件
- gdb还可以调试已经运行的程序:
#方法一: ps获取程序PID
gdb <程序名> PID
#方法二:先关联上程序,再挂接进行PID
gdb <程序名>
attach PID # 挂接PID
detach PID # 取消挂接
暂停程序
调试程序中,暂停程序运行是必须的, GDB 可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。
在 gdb 中,我们可以有以下几种暂停方式: 断点( BreakPoint )、观察点( WatchPoint )、捕捉点(CatchPoint )、信号( Signals )、线程停止( Thread Stops )。如果要恢复程序运行,可以使用 c 或是 continue 命令
当进程被 gdb 停住时,你可以使用 info <程序名>
来查看程序的是否在运行,进程号,被暂停的原因
一、断点
设置程序停住的地方,可以选择以下几种方式设置断点:
1. break functionname 在进入指定函数时停住
2. break linenum 在指定的行号停住
break +offset 在当前行号前offset行停住
break -offset
3. break filename:functionname 在源文件filename的functionname入口处停住
4. break filename:linenum 在源文件filename的linenum行处停住
5. break *address 在程序运行的内存
6. break 没有参数时表示在下一条指令处停住
7. break ... if <condition> ...可以上上面的参数,condition表示条件,当条件满足时停住
8. info break 查看断点
断点菜单:
在 C++ 中,可能会重复出现同一个名字的函数若干次(函数重载),在这种情况下, break < function > 不能告诉 GDB 要停在哪个函数的入口。当然,你可以使用 break<function(type)> 也就是把函数的参数类型告诉 GDB ,以指定一个函数,否则的话GDB会返回一个断点菜单供你选择:
二、观察点
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化, 马上停住程序。我们有下面的几种方法来设置观察点:
watch <expr> # 为表达式(变量) expr 设置一个观察点。一但表达式值有变化时,马上停住程序
rwatch <expr> # 当表达式(变量) expr 被读时,停住程序
awach <expr> # 当表达式(变量)的值被读或被写时,停住程序
info watchpoints # 列出当前所设置的所有观察点
三、设置捕捉点
捕获程序运行时的一些事件。如:载入共享库(动态链接库)或是 C++ 的异常
catch <event>
当 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 < libname > 载入共享库(动态链接库)时。( load 为关键字,目前此功能只在 HP-UX 下有用)
7 、 unload 或 unload 卸载共享库(动态链接库)时。( unload 为关键字,目前此功能只在 HP-UX 下有用)
tcatch <event> # 只设置一次捕捉点,当程序停住以后,应点被自动删除。
四、失能或删除停止点
上面说了如何设置程序的停止点, GDB 中的停止点也就是上述的三类。
在 GDB 中,如果你觉得已定义好的停止点没有用了,你可以使用 delete 、 clear 、 disable 、 enable 这几个命令来进行维护。
- 删除
clear # 清除所有已定义的停止点
clear <functionname> 或 clear <filename:functionname> # 清除所有设置在函数上的停止点
clear <linenum> 或 clear <filename:linenum> # 清除所有设置在指定行上的停止点
delete [breakpoints] [range...] # 删除指定的断点,range表示断点号范围
- 失能
disable [breakpoints] [range...]