GDB 源码分析系列文章四:gdb 事件处理异步模式分析 ---- 以 ctrl-c 信号为例

系列文章:

GDB 源码分析系列文章一:ptrace 系统调用和事件循环(Event Loop)
GDB 源码分析系列文章二:gdb 主流程 Event Loop 事件处理逻辑详解
GDB 源码分析系列文章三:调试信息的处理、符号表的创建和使用
GDB 源码分析系列文章四:gdb 事件处理异步模式分析 ---- 以 ctrl-c 信号为例
GDB 源码分析系列文章五:动态库延迟断点实现机制

GDB 源码分析系列文章四:gdb 事件处理异步模式分析 ---- 以 ctrl-c 信号为例

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");
  }</
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值