最常见的多进程的形式如下:

pid = fork();
if (pid < 0) {  // fork failedprintf("fork error\n");exit(1);
} else if (pid > 0) { // parent process// command
} else { // child process// command
}

对于这种类型的多进程程序的调试,在gdb中使用选项follow-fork-mode即可。
使用:set follow-fork-mode child,即可追踪子进程。而 set follow-fork-mode parent 可调试父进程。

还有一种多进程程序的形式为:

pid = fork();
if (pid < 0) {  // fork failedprintf("fork error\n");exit(1);
} else if (pid > 0) { // parent process// command
} else { // child processexecv("a.out", NULL);
}

这种程序的调试则要困难一些,下面我们通过一个实际的例子来看一下它的调试方法。
当前有两个代码test.c和child.c,其中test.c中的子进程通过execv调用child.c。

test.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>int main()
{int ret = 0;ret = fork();if (ret == 0) {execv("a.out", NULL);  //a.out是child.c编译成的可执行文件}return 0;
}
child.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>int main()
{my_print();return 0;
}int my_print()
{printf("hello world\n");return 0;
}

使用gdb调试的详细过程如下所示:

上面的例子中,最重要的操作时catch exec这个事件。捕获到exec这个事件之后再往子进程的程序中打一个断点,然后执行continue操作。可以看到,此时程序就会进入到exec调用的子进程中了。

网上介绍gdb调试fork+exec创建的子进程的方法有不少,实际使用之后觉得,还是这种方法操作起来较为简洁明了。大家如果有什么更好的方法,请一定告诉我。

后记:

本文主要介绍的是使用gdb调试fork+exec创建的子进程的方法。虽然方法是知道了,但是在实际的工作中,这种方法的实用性并不是十分的高。因为上述方法有很大的局限性:这种方法只能用在父进程中仅有一个exec的程序中。

当程序中存在多个fork+exec,使用上述的方法只能进入到第一个子进程中!!因此,想要调试其他的子进程就不行了。然而,对于任意一个子进程都可以自由的进行调试,才是我的真正目标。我也会继续调查gdb对于fork+exec创建的多个子进程的调试方法,一旦有进展将会及时和大家分享。

gdb调试fork+exec创建的子进程的方法相关推荐

  1. gdb调试fork多进程

    在大多数系统,gdb对使用fork创建的进程没有进行特别的支持.当父进程使用fork创建子进程,gdb仍然只会调试父进程,而子进程没有得到控制和调试.这个时候,如果你在子进程执行到的代码中设置了断点, ...

  2. PWN中的gdb调试, pwndbg,peda,gef 切换使用的方法;

    peda 用来做逆向破解是最方便的 gef 用来 debug 最好 pwndbg 做pwn题很方便 当你把三款调试工具装完之后,他们不能同时使用,并且他们的切换也不方便 三个插件的下载 Peda gi ...

  3. linux 创建子进程,linux中fork同时创建多个子进程的方法(一)

    Fork同时创建多个子进程方法 第一种方法:验证通过 特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程 int main(void) { prin ...

  4. 实战能力|一文看懂GDB调试底层实现

    在程序出现bug的时候,最好的解决办法就是通过 GDB 调试程序,然后找到程序出现问题的地方.比如程序出现 段错误(内存地址不合法)时,就可以通过 GDB 找到程序哪里访问了不合法的内存地址而导致的. ...

  5. GDB调试之ptrace实现原理

    目录 ptrace系统调用 ptrace使用示例 ptrace实现原理 进入被追踪模式(PTRACE_TRACEME操作) 获取被调试进程的内存数据(PTRACE_PEEKTEXT / PTRACE_ ...

  6. 实战能力|一文看懂GDB调试上层实现

    一.前言 这篇文章来聊聊大名鼎鼎的GDB,它的豪门背景咱就不提了,和它的兄弟GCC一样是含着金钥匙出生的,在GNU的家族中的地位不可撼动.相信每位嵌入式开发工程师都使用过gdb来调试程序,如果你说没有 ...

  7. Linux中fork()系统调用创建两个子进程

    使用系统调用fork()创建两个子进程: #include <stdio.h> #include <unistd.h>int main(){int fpid = fork(); ...

  8. gdb 调试+子进程+线程

    一.gdb常用指令: gcc -g main.c //在目标文件加入源代码的信息 gdb a.out (gdb) start //开始调试 (gdb) n //一条一条执行 (gdb) step/s ...

  9. linux_进程类相关学习-fork函数-getpid函数-getppid函数-getuid函数-geteuid函数-getgid函数-getegid函数-进程之间共享数据-进程gdb调试

    接上一篇:linux_环境变量-C语言代码打印环境变量-getenv函数-setenv函数-unsetenv函数 本次来分享进程类相关的学习,主要就是分享一些函数的使用,来,开始上菜: 目录 1.fo ...

最新文章

  1. (四)maven之查找jar包坐标,选择jar包版本
  2. qgc地面站如何导入离线地图_地面站开发资源汇总
  3. ansbile--playbook剧本案例
  4. 【iOS-cocos2d-X 游戏开发之八】使用Lua脚本进行游戏开发(基础篇)
  5. java 操作office_Java操作word的方法
  6. 软件设计文档国家标准—软件需求说明书(GB856T——88)
  7. 服务器上文件拒绝访问,云服务器文件访问被拒绝访问
  8. windows安装php
  9. js鼠标经过与离开事件
  10. html中使用img标签图片无法正常显示
  11. 安卓街机模拟器对战源码修改详解(1)
  12. 毕业论文参考文献引用
  13. [分享] 揭开美国顶尖生物医学实验室成功的法宝--转
  14. OC语言之Objective-C简介
  15. vue中将base64的pdf文件流转换成pdf并预览(二)——base64转PDF工具的使用
  16. linux yum安装rar解压软件
  17. 五十种语言的“圣诞快乐”(上):分析与实现
  18. 前端学习(一) body标签(下)
  19. 用户流失,该怎么分析?
  20. 圆弧方向判断方法和三点确定一个圆的计算方法

热门文章

  1. 电子书下载:Moving to Microsoft Visual Studio 2010
  2. 管你MySQL还是Oracle,数据库管理就完事了
  3. 菜鸟学Linux 第090篇笔记 corosync+drbd+mysql
  4. 机器学习中的数学-线性判别分析(LDA), 主成分分析(PCA)
  5. python之强大的日志模块
  6. 基本数据类型和引用数据类型作为参数时候的问题
  7. 对Web页面元素的绝对唯一引用方法
  8. 简单的图片处理servlet
  9. PostgreSQL · 实现分析 · PostgreSQL 10.0 并行查询和外部表的结合
  10. linux kernel的中断子系统之(三):IRQ number和中断描述符【转】