gdb调试多进程和多线程

来源:互联网 发布:小米手机一直2g网络 编辑:程序博客网 时间:2024/06/16 00:09

在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

原创粉丝点击