gdb调试多进程和多线程

在LINUX中,GDB 没有对多进程程序调试提供直接支持,例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去。如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。

这里介绍三种方法:follow-fork-mode 方法,attach 子进程方法和 GDB wrapper 方法;

follow-fork-mode

首先需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)。
前者可以通过命令set follow-fork-mode [parent|child]进行设置调试父进程还是子进程。
parent 只调试主进程(GDB默认)
child 只调试子进程
后者可以通过set detach-on-fork [on|off]指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制。
on: 断开调试follow-fork-mode指定的进程。
off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。

调试:
这里写图片描述

切换子进程

这里写图片描述

Attach子进程

GDB有附着(attach)到正在运行的进程的功能,即attach 命令。因此我们可以利用该命令attach到子进程然后进行调试。即我们运行想要调试的相应进程,再获取其PID,通过attach进行调试该进程。

GDB wrapper

父进程 fork 出子进程,子进程会紧接着调用 exec族函数来执行新的代码。对于这种情况,我们也可以使用gdb wrapper 方法。它的优点是不用添加额外代码。其基本原理是以gdb调用待执行代码作为一个新的整体来被exec函数执行,使得待执行代码始终处于gdb的控制中,这样我们自然能够调试该子进程代码,但同时也需要X环境支持(xterm/VNC)。

另外,多线程调试GDB是默认支持的,跟主线程,子线程block在create thread。
相关命令:
查询线程:info threads
切换调试线程:thread

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值