系列文章:
GDB 源码分析系列文章一:ptrace 系统调用和事件循环(Event Loop)
GDB 源码分析系列文章二:gdb 主流程 Event Loop 事件处理逻辑详解
GDB 源码分析系列文章三:调试信息的处理、符号表的创建和使用
GDB 源码分析系列文章四:gdb 事件处理异步模式分析 ---- 以 ctrl-c 信号为例
GDB 源码分析系列文章五:动态库延迟断点实现机制
gdb 处理的事件主要包括用户事件和目标程序事件。事件的处理可以分为同步模式和异步模式。本文介绍 gdb 事件处理的异步模式,并以 gdb 调试过程中 ctrl-c 信号为例展开介绍,其他信号事件的处理也是类似的。
gdb 调试目标程序时,如果目标程序正在运行,此时你输入 ctrl-c 信号,gdb 将暂停目标程序。本文将结合 gdb 源码分析一下 gdb 如何处理 ctrl-c 信号。
事件循环机制回顾
在前面的文章中,我们比较详细地介绍了 gdb 的事件循环机制,这里我们做下简单的前情回顾。
gdb 在完成初始化后,即进入事件循环(Event Loop)中。对于 gdb 而言,事件主要包括用户输入事件和目标程序事件。目标程序状态发生变化时(例如击中断点),目标程序会将自己暂停,并向 gdb 发送 SIGCHLD 信号,gdb 再收到 SIGCHLD 信号后,向 Event Loop 事件源 pipe 写入目标程序事件,Event Loop 通过 poll / select 读取该事件,即进入相应的事件处理。比如如果当前断点是条件断点,则判断条件是否满足,不满足则让目标程序继续执行,如果满足则进行相关处理,最后写入 stdin(用户输入) 事件。Event Loop 的 poll /select 检查到 stdin 事件后则进入等待用户命令状态,接收到用户命令则继续相应的处理。
异步处理模式分析
我们以 gdb 调试多线程程序为例,分析 gdb 如何处理 ctrl-c 信号。
多线程程序
下面是一个简单的多线程程序。
#include <stdio.h>
#include <unistd.h> //sleep
#include <pthread.h>
void* func_1() {
while(1) {
sleep(1);
printf("========== thread 1 \n");
}</

最低0.47元/天 解锁文章
1688

被折叠的 条评论
为什么被折叠?



