02-GDB进阶

上篇文章已经认识了GDB调试工具的简单使用方法,已满足日常的使用需求。本文重点介绍GDB进阶内容中的运行程序、暂停程序。

运行程序

在gdb中,运行程序使用r或run即可运行程序,但有可能会需要有以下四个方面设置的需求:

  1. 程序运行参数

    set args  #指定运行时参数
    show args #查看设置好的运行参数
    
  2. 运行环境

    path <dir> # 可设定程序的运行路径
    show paths # 查看程序的运行环境
    set environment varname[=value] # 设置环境变量
    show enviroment [varname] #查看环境变量
    
  3. 工作目录

    cd <dir> #相当于shell的 cd 命令
    pwd #显示当前所在目录
    
  4. 程序的输入输出

    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...]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值