如何在GDB中子进程退出后切回父进程继续调试?
调试fork架构CGI程序:子进程退出后回到父进程的方法
你的核心问题是GDB默认跟踪子进程,子进程执行exit(0)后调试会话终止,无法回到存活的父进程。以下是几种可行的解决方法:
方法1:修改GDB的fork跟踪模式
- 默认GDB的
follow-fork-mode为child,fork后会自动跟踪子进程。执行set follow-fork-mode parent,让GDB在fork后继续跟踪父进程,子进程将在后台运行。如果需要调试子进程的cgi函数,可临时将模式改为child,调试完成后再切回父进程跟踪。 - 若要同时保留父子进程的调试会话,执行
set detach-on-fork off。此时fork出子进程时,GDB会维护两个独立的调试会话,子进程退出后,用info inferiors查看所有进程列表,再执行inferior <父进程对应的编号>即可切换回父进程继续调试。
方法2:临时修改子进程代码(仅调试用)
在子进程的exit(0)前添加断点或暂停操作:
cgi(fd, url, a3, data, count); // debug into internal // 调试阶段临时添加,调试完成后删除 getchar(); // 让子进程暂停,等待用户输入 exit(0);
当子进程停在getchar()时,在GDB中执行detach命令分离子进程,此时GDB会自动回到父进程的调试上下文,可继续跟踪waitpid之后的++count等逻辑。
方法3:利用GDB的进程切换功能
开启set detach-on-fork off后,fork操作会生成新的调试进程实例,通过以下步骤切换回父进程:
- 执行
info inferiors,查看当前所有正在调试的进程,找到父进程对应的编号。 - 执行
inferior <编号>,直接切换回父进程的调试会话,即使子进程已退出,父进程的调试状态依然保留,可继续设置断点调试后续代码。
附你的代码片段:
pid = fork(); if ( pid >= 0 ) { if ( !pid ) { cgi(fd, url, a3, data, count); // debug into internal exit(0); } waitpid(pid, stat_loc, 0); ++count; } else { sub_1C45((unsigned int)fd); }
内容的提问来源于stack exchange,提问作者Squ
相关产品推荐
相关产品推荐

