gdb调试多进程

之前我们介绍了gdb调试的相关命令与操作gdb调试命令,下面我们再来了解一下如何用gdb调试多进程。


        事实上真正在运用上并不是只有一个进程在运行,多进程的方式能够达到很好的效率。gdb也可以调试多进程,但是在默认情况下,gdb只会调试主进程。但是通过设置参数follow-fork-mode(默认值为parent)detach-on-fork(默认值为on)就可以调试多进程程序,这两个参数的意思如下

follow-fork-modedetach-on-fork情况
parenton只调试父进程
childon只调试子进程
parentoff同时调试父进程和子进程,gdb跟父进程,子进程在fork位置
childoff同时调试父进程和子进程,gdb跟子进程,父进程在fork位置


下面给一段代码来调试多进程程序

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
	pid_t pid=fork();//创建子进程

	if(pid < 0)
	{
		perror("fork");
		return -1;
	}
	else if(pid == 0)//子进程
	{
		printf("I am child:My pid is %d,my father's pid is %d\n",getpid(),getppid());
	}
	else//父进程
	{
		printf("I am father:My pid is %d\n",getpid());
		wait(NULL);//等待子进程
	}
	return 0;
}


    使用gdb开始调试程序,需要在编译的时候加上-g选项。

    1 .首先,查看一下系统当前默认的两个参数的值

    2 .用list命令列出源代码,分别在父子进程的开始处下一个断点



    3 .当前的默认两个参数的默认值是parent和on,意思是只调试父进程,我们将follow-fork-mode的参数改为child,将detach-on-fork的参数改为off,意思是同时调试父子进程,让gdb跟子进程,父进程在fork处


    4.运行程序,查看正在调试的进程


蓝色框部分表示这是一个新进程2833,即子进程的pid红色框部分是下一句要执行的代码

info inferiors命令:gdb将每一个进行调试的程序记在inferiors中,并分给它们ID,可以通过info inferiors命令来查看gdb调试的进程,带有*的进程是正在调试的进程。

输入c(continue)命令继续调试程序

子进程运行完,并退出。

    5.切换调试的程序,并运行

父进程运行完,并退出。

可以看到现在已经没有进程了。

    6.其余相关命令

  • add-inferior [-copies <N>] [-exec <FILENAME>]加入一个新的inferior,N是可用的inferior的ID,默认为1;FILENAME是一个可执行程序的文件名
  • remove-inferior ID 删除一个inferior,不能是正在被调试的inferior
  • clone-inferior [-copies <N>] [ID] 复制N个编号是ID的inferior。如果不指定N的话,默认复制一个inferior。如果不指定ID,则默认复制正在调试的inferior
  • detach inferior 分离出一个ID编号的inferior,这个inferior仍旧可以被执行,还存在。
  • kill inferior 杀死一个ID编号的inferior,这个inferior仍旧可以被执行,还存在。    

            注意看一下kill和detach的区别

        注意看红色部分,detach子进程之后,子进程还是输出了,即子进程还是跑完了,但是kill子进程之后,什么都没有输出,即直接跳过了,这个地方的区别需要注意一下。当然了,他们都还是可以继续run的,如果想要删除用remove_inferior。

  • set schedule_multiple on|off 设为off,只有当前inferior会执行;设为on,所有在执行状态的inferior都会执行
  • set follow-exec-mode same|new 设置same:当发生exec的时候,在执行exec的inferior上控制子进程;
    设置为new:新建一个inferior给执行起来的子进程,而父进程的inferior仍然保留,当前保留的inferior的程序状态是没有执行。
  • set print inferior-events on|off 用来打开和关闭inferior状态的提示信息
  • maint info program-spaces 查看gdb一共管理了多少地址空间


<think>好的,用户想了解如何使用GDB调试多进程程序,特别是设置调试进程的方法。首先,我需要回忆GDB处理多进程调试的相关命令和策略。记得GDB默认是跟踪父进程,子进程会继续运行不受控制,所以需要配置才能调试子进程。 接下来,应该分步骤说明不同的方法。首先想到的是`follow-fork-mode`,这个选项可以设置为父进程或子进程。需要详细解释如何设置,比如在启动GDB后使用`set follow-fork-mode child`来跟踪子进程,或者用`parent`保持默认。还要提到`show follow-fork-mode`来查看当前模式。 然后,另一个相关的是`detach-on-fork`,它决定在fork之后GDB是否保持对其他进程的控制。如果设置为off,GDB会同时控制父进程和子进程,这时候可能需要配合`inferior`命令来切换不同的进程。这部分需要举例说明,比如切换inferior编号,以及如何查看当前进程。 另外,用户可能需要附加到已运行的进程上,所以需要提到`attach`命令的用法,结合进程ID。还有在代码中插入断点或者`sleep`的方法,以便有时间附加到子进程。 还需要注意不同GDB版本的差异,比如某些命令可能在旧版本中不可用。此外,多线程和多进程的区别可能让用户混淆,需要明确说明这里是多进程的情况。 最后,总结常用方法,提醒用户根据具体情况选择跟踪模式或手动附加,并给出示例命令。确保步骤清晰,让用户能逐步操作,并验证是否有效。可能还要提醒检查GDB版本,或者如何处理常见问题,比如无法附加进程时的权限问题。</think>GDB调试多进程程序时,可通过以下方法设置调试目标进程: ===== 1. 基础设置 ===== 在GDB中通过命令控制fork后的跟踪目标: ```gdb (gdb) set follow-fork-mode parent|child # 设置跟踪父/子进程 (gdb) set detach-on-fork on|off # 控制是否分离未跟踪进程 ``` 示例场景: ```c // 示例代码片段 pid_t pid = fork(); if (pid == 0) { child_process(); // 子进程代码 } else { parent_process(); // 父进程代码 } ``` ===== 2. 多进程调试模式 ===== ◆ 模式1:跟踪单个进程 ```gdb # 默认跟踪父进程 (gdb) set follow-fork-mode parent (gdb) set detach-on-fork on # 或跟踪子进程 (gdb) set follow-fork-mode child ``` ◆ 模式2:同时调试多个进程 ```gdb (gdb) set detach-on-fork off # 保留所有fork的进程 (gdb) info inferiors # 查看进程列表 (gdb) inferior 2 # 切换到第二个进程 ``` ===== 3. 高级调试技巧 ===== ▶ 附加调试已有进程 ```bash # 在终端获取子进程PID ps -ef | grep [程序名] # 在GDB中附加 (gdb) attach <pid> ``` ▶ 代码层控制 ```c // 在子进程代码开始处添加调试桩 void child_process() { volatile int wait_gdb = 1; while(wait_gdb); // 在此处设置断点 //...实际代码... } ``` ===== 4. 验证设置 ===== 调试时使用以下命令确认状态: ```gdb (gdb) show follow-fork-mode # 显示当前跟踪模式 (gdb) info inferiors # 列出所有被控进程 (gdb) inferior # 显示当前调试的进程 ``` ===== 注意事项 ===== 1. Linux内核≥3.9需设置: ```bash echo 0 > /proc/sys/kernel/yama/ptrace_scope ``` 2. 建议使用GDB≥7.0版本 3. 多进程调试时注意断点设置位置(不同进程地址空间独立) 典型调试流程示例: ```gdb $ gdb ./multi_process_prog (gdb) b main (gdb) set detach-on-fork off (gdb) r # 程序fork后暂停 (gdb) info inferiors Num Description Executable 1 process 1234 multi_process_prog 2 process 5678 multi_process_prog (gdb) inferior 2 (gdb) b child_func (gdb) c ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值