【Linux】使用gdb调试多进程&多线程

本文介绍如何使用GDB调试多进程与多线程程序,包括设置断点、切换调试目标、同时操作多个进程或线程的方法,以及控制线程运行模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gdb调试多进程


多进程时,进入调试状态后,默认调试主进程。
1. 查找fork出子进程的代码在第几行,然后打上断点。
这里写图片描述

2.运行至断点处,info feriors可查看当前调试的进程
这里写图片描述

3.设置follow-fork-mode 的值为child,表示只调试的子进程,再查看当前调试进程发现变成了新产生出来的进程,即子进程。follow-fork-mode(默认值是parent)和detach-on-fork(默认值是on)结合使用。4种组合的意义分别如下:

follow-fork-modedetach-on-fork说明
parenton只调试父进程
childon只调试子进程
parentoff同时调试两个进程,gdb跟主进程,子进程block在fork位置
childoff同时调试两个进程,gdb跟子进程,主进程block在fork位置

所以我们set follow-fork-mode child ,detach-on-fork没有设置,默认是on,即第二种使用场景,只调试子进程。
这里写图片描述
4.可以使用inferior+进程编号(即info inferiors后显示在第一列的号码)来切换当前正在调试的进程。
这里写图片描述
以上就是调试多进程用到的命令。

gdb调试多线程


1.在创建完线程的代码处打上断点,运行至断点处,info threads查看当前进程内的线程。可以看到,当前正在调试的是主线程。
这里写图片描述
2.和多进程类似,可以使用thread+线程编号切换当前正在调试的线程。
所以,thread 后*号到了编号为3的线程的前面,表示当前调试的就是该线程。
这里写图片描述
3.使用thread apply [编号…] [命令]可以让多个线程同时执行某条命令。
如:让2,3线程同时向下执行一步。也可以使用thread apply all [命令],让所有线程执行某个调试命令。
这里写图片描述
4.可以设置scheduler-locking参数(默认值为off),控制是多个线程同时运行还是只运行某个线程,它的取值和意义如下:

scheduler-locking意义
on当前调试的线程单独运行
off所有线程一起执行
step没有发生函数调用时单独执行当前线程,有函数调用时所有线程一起执行

这里写图片描述
有关于多线程调试的常用命令大概就是这些。

<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、付费专栏及课程。

余额充值