GDB调试fork+exec创建的子进程的方法
来源:互联网 发布:淘宝外卖会员卡怎么用 编辑:程序博客网 时间:2024/05/29 09:25
多进程是Linux编程中一个很重要的内容,典型的例子就是守护进程(daemon)。有关守护进程的定义和编程规范,请参考:
http://blog.csdn.net/tuzhutuzhu/article/details/19092211
最常见的多进程的形式如下:
- pid = fork();
- if (pid < 0) { // fork failed
- printf("fork error\n");
- exit(1);
- } else if (pid > 0) { // parent process
- // command
- } else { // child process
- // command
- }
使用:set follow-fork-mode child,即可追踪子进程。而set follow-fork-mode parent可调试父进程。
还有一种多进程程序的形式为:
- pid = fork();
- if (pid < 0) { // fork failed
- printf("fork error\n");
- exit(1);
- } else if (pid > 0) { // parent process
- // command
- } else { // child process
- execv("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创建的多个子进程的调试方法,一旦有进展将会及时和大家分享 0 0
- GDB调试fork+exec创建的子进程的方法
- GDB调试fork+exec创建的子进程的方法
- GDB调试fork+exec创建的子进程的方法
- GDB调试多进程的fork+exec
- 关于fork创建子进程的疑问
- 用gdb调试程序的子进程
- fork函数创建子进程,exec函数执行命令
- 用GDB跟踪fork创建父进程和子进程
- 【C/C++】多进程:子进程的创建fork()
- 进程创建system、exec、fork
- linux创建进程fork的方法步骤
- 【操作系统】linux创建子进程--fork()方法
- 【操作系统】linux创建子进程--fork()方法
- valgrind跟踪fork出的子进程-debug调试
- 关于fork的创建,子进程的执行
- fork创建子进程
- fork创建子进程
- fork创建子进程
- iOS 字符串转长度
- SQLyog v9.63 试用30天到期解决办法
- Storm的基本配置项
- 系统内部问题
- [LeetCode] Letter Combinations of a Phone Number
- GDB调试fork+exec创建的子进程的方法
- 算法分析-汉诺塔问题(一)
- Unity调用DLL
- redis安装
- 模拟赛 土豪聪要请客
- 利用递归将整数转化为二进制
- APP-FND-00676: 弹性域例程 FDFGDC 无法读取为此说明性弹性域指定的默认引用字段
- https证书是网购站点的必备利器
- CAsyncSocket及CSocket的区别和用法