LWN:如何修复GDB中一个古老的问题!

Linux0.11 键盘中断处理过程 键盘中断处理 阅读详情

关注了就能看到更多这么棒的文章哦~

How to fix an ancient GDB problem

By Jonathan Corbet
September 29, 2022
Cauldron
DeepL assisted translation
https://lwn.net/Articles/909496/

GDB 调试器历史相当长,早在 1986 年就创建了。因此,经常看到一些 GDB 的开发发生在挺长的时间段内,但是,哪怕是考虑上这个因素,在看到 2007 年首次报告的一个公开 bug 仍然存在的时候,读者可能仍然会觉得有些吃惊。在 2022 年的 GNU Tools Cauldron 会议上,GDB 维护者 Pedro Alves 谈到了为什么这个问题一直难以解决,以及最终的解决方案是什么。

Alves 说,这个问题与键盘中断的处理有关,这种 keyboard interrupt 通常是由用户点击 control-C 造成的。用户通常期望,在 target 程序运行时,在 GDB 内部收到中断,就会停止程序并返回 GDB 提示。然而,如果该程序屏蔽掉了 SIGINT 信号的话,中断将永远不会被传递回来。比较好的情况是看到 GDB 没有停下来;在最坏的情况下,整个 debug session 会话可能被卡住,需要另开一个终端来 kill 它。GDB 用户应该是不喜欢这种行为的。

这个问题源于 GDB 对终端(terminal)和中断信号(interrupt signals)的处理方式。在 Unix 中一个 "会话(session)" 代表着若干个共享着同一个控制终端的进程组。通常来说,被调试的进程与 GDB 是在同一个会话中运行的,并且与 GDB 共享同一个终端,但是 GDB 会将该进程放入另一个进程组。多个进程组可以共享一个终端,但其中只有一个进程组–前台组(foreground group)–会接收到用户在该终端生成的信号。GDB 通常是作为前台组运行,但是当它在运行目标程序时,会指定该程序的组为前台组。

f2b51521e8cd4951a82217b898597504.png

一般情况下,如果 target 进程收到一个 SIGINT 信号,此信号会被 GDB 截获;这是用 ptrace() 进行跟踪分析的具体实现之一。GDB 会把目标程序停下来,并且发出提示;这个信号实际上不会被传递给该程序。然而,如果目标程序阻止了 SIGINT,那么此信号保持 pending 状态;因为它从未被发送给接收者,所以 ptrace() 不知道需要拦截它。这可能会导致大家一起被卡住了。还有其他途径可以导致同样的情况;例如,sigwait() 调用可以采用一种让这些 pending 信号不会再发送出去的方式来把它处理掉。

Alves 说,解决方案与计算机科学中的其他问题都是一样的:添加另一个抽象层(add another layer of indirection)。在这个场景中,就需要使用伪终端(PTY, pseudo-terminal)这个抽象层,它会被赋予 target 进程而不是真正的终端。然后 GDB 会成为两个终端之间的中间人。任何由目标程序写入 PTY 的输出内容都会被简单地复制到真正的终端上。输入就比较麻烦了,因为目标程序可能已经改变了终端的模式;GDB 必须把真实的终端配置成 raw mode,然后把真实终端的所有输入都复制到 PTY 中。当目标程序不再运行时,终端被改回 "readline mode",从而方便跟 GDB 交互。

现在,target 就可以对 SIGINT 做任何事情都不会影响 GDB 了,GDB 作为真实终端的前台进程,可以直接处理这些事件。由于该终端处于 raw 模式,这意味着其可以识别出 interrupt 字符并做出相应的反应。还有其他的好处;由于 GDB 仍然可以控制什么时候把输出内容送到(真实)终端,那么它可以避免将自己的输出与 target 进程的输出信息混在一起。还有另一个优点,GDB 现在能够在 interrupt 之后继续保留用户所选择的线程(就是 debug 过程中所关注的哪一个特定线程);这在以前是不可能的。

他说,还实现了一个 "逃生舱把手(escape hatch)",如果有人希望回到以前的行为的话,就可以利用这个开关;无论如何,都需要这个功能来确保其他 Unix 系统可以使用这个 GDB。

他还介绍了一些其他的问题。前台进程组中的第一个进程被内核认为是 "session leader";如果该进程 exit 的话,那么它的子进程将收到一个 SIGHUP 信号。大多数应用程序都没有对此做好准备,从而会被 kill 掉。现在,target 程序有了自己的终端,在启动之后它就成为了 session leader。如果这个进程进行了 fork 并退出,它的子进程很可能会意外结束掉,这可不是用户在调试过程中想看到的行为。

这种情况下的解决方案是 double-fork 技巧的一个变种:在启动目标程序之前,GDB 将 fork 两次,第一个进程除了等待之外,什么都不做。它将成为 session leader;由于它没有退出,所以如果 target 程序做了什么意外的动作,也不会产生 SIGHUP 信号。

GDB 仍然有必要去把那些拦截了 SIGINT 的程序给停下来。出于一些明显的原因,它不能使用 SIGINT 来达到这个目的。他说,这里的解决方案就是使用无法被拦截的 SIGSTOP 信号来代替它。

Emacs 用户总是能提出他们自己特有的一些特殊情况。Emacs 将 control-C 改作它用了,并将 SIGINT 重映射到 control-G。这种情况下,用户肯定希望能把 control-C 传递给 target。解决方案就是新增一个 GDB 命令,允许用户指定哪个键应该中断进程并返回到 GDB 提示符。

这个 patch 的原型在 2019 年首次出现,但直到 2021 年才来到 GDB 邮件列表。当时出现了一些问题,包括 session-leader 相关的问题。这些都已经解决了,Alvis 打算近期再次发布这组 patch。他总结说,他的目标是每年至少发出来一次,直到问题最终得到解决为止。

[感谢 LWN 订户对我参加这次活动的支持]。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

format,png

Pandas入门教程(二十二):股票数据分析实战——yfinance 获取数据、技术指标与收益率分析 把 Pandas 用在真实场景,才能体会它的价值。本文以茅台股票为例,用 yfinance 获取历史行情,完成缺失值处理与列筛选,绘制收盘价曲线,计算 SMA 移动平均线与 RSI 相对强弱指数,并通过日收益率、累计收益率和波动率完成完整的量化分析流程。 阅读详情

相关推荐

opencv读取海康威视摄像头相关配置

1、开发环境 海康威视的网络摄像头使用: 开发工具:vs2015 C++ 海康SDK 2、相关操作 下载海康威视SDK:网址:http://www.hikvision.com/cn/download_61.html • 1:对照自己的开发平台可以下载设备网络SDK_Win32设备网络SDK_Win64,解压到本地文件下: • 2:VS配置 、Opencv配置。参考址 http://blog.youkuaiyun.com/poem_qianmo/article/details/19809337 (建议自己创

HMJ115的博客 984

信号没传给程序?原来 GDB 偷偷拦下来了!

文旨在深入探讨GDB如何处理Linux信号,以及不同信号处理方式对调试的影响。

2401_84703565的博客 1508

北斗B1频点信号捕获实战:如何应对NH码跳变带来的挑战?

本文深入探讨了北斗B1频点信号捕获中NH码跳变带来的核心挑战。针对NH码以1kHz速率调制导致的相干积分中断和相关峰畸变问题,文章提出并详细解析了一种基于伪码与多普勒频率分离技术的优化捕获方案。该方案通过差分处理消除NH跳变影响,并利用匹配滤波器与FFT分别进行码相位和多普勒频率的快速估计,有效提升了弱信号环境下的捕获灵敏度和稳定性,为北斗接收机设计提供了实用的工程参考。

joy55的博客 534

用gdb调试python多线程代码-记一次死锁的发现

|版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以邮件:wangxu198709@gmail.com 前言 相信很多人都有使用过sqlite3的经验,一年前因为项目上的需要,写了一个基于sqlite3的持久化队列库(persist-queue),已经发布在pypi上有段时间了。 前段时间,一下子来了两个is...

weixin_30950607的博客 1093

USB3.0/3.1信号完整性分析仿真

• 1.了解USB3.0通路的互连关系,解读原理图接口电路和PCB的互连电路。对USB布线的通路及阻抗进行检查和分析。 • 2.使用USB3.0实例文件提取互连线的S参数,选择SSRX+,SSRX-,SSTX+,SSTX-,D+,D-组的互连线,使用PowerSI,Clarity,3DFEM等工具提起关键网络的S参数。提取S参数以后需要分析S参数的互连特征,对S参数的结果开展评价。 • 3.使用SYSTEM SI USB3 Compliance工程向导模型,建立USB仿真实例框架,在框架BOLCK中带入S参

小猪配齐电子设计 1万+

基于Lora的一主多从监测与控制系统

题目:基于Lora的远程农业监测与控制系统 目的:通过Lora子节点采集好各种传感器的信息,发送给汇聚节点,汇聚节点将数据通过ESP8266上传至云端,使用了微信小程序进行监测与控制

热爱生活、奋斗前行 7841

已解决(Python键盘中断报错问题) KeyboardInterrupt

成功解决(Python键盘中断报错问题):KeyboardInterrupt

努力让自己发光,对的人才能迎着光而来 7万+

Truncated SVD for faster dection

Truncated SVD方法最先被提出在《Fast R-CNN》论文中,用于降低全连接层的运算量,提升模型的速度。在卷积神经网络的分类任务中,FC层的运算速度远远大于CONV层,而在Fast R-CNN的目标检测任务中,大多数的运算时间发生在FC 的运算中,是因为针对每张输入图片,只进行一次卷积操作,而要对生成的Region Proposal,大致两千个,进行全连接操作进行分类与Bounding...

weixin_35747666的博客 1535

linux 出现 KeyboardInterrupt 怎么退出

现象: 下载python后linux 出现keyboardInterrupt一直无法退出当前界面 原因: 好像是东西没下完 解决办法 想退出按照常规按了Ctrl +c 没效果 正确的方式是退出是 exit() or Ctrl + d 总结linux 退出方式 1.Ctrl+c 2.Ctrl+d 3.Ctrl+x 4.exit 或者exit() ...

Connie1451的博客 6064

[Dify实战] 招投标标书智能生成:模板套用 + 风险校验

摘要:本文提出基于Dify构建AI标书生成工作流,解决传统标书撰写中内容重复(80%复用率)、人工修改效率低、风险检查易出错等痛点。方案包含三大核心模块:1)智能生成(基于模板自动填充项目信息);2)风险校验(AI自动检查废标风险点);3)多角色协作。通过拆分标书结构、设置详细Prompt、建立风险检查清单,实现从"人工撰写"到"参数化自动生成+AI审核"的转型,最终输出标准格式文档并支持企业系统集成。典型应用场景下,系统能自动生成技术方案并识别关键风险(如支付安全合

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 827

5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go)

5.30华为OD机试真题 新系统 - 链表数字游戏 (Java/Py/C/C++/Js/Go)

算法大师! 1116

centos下 KeyboardInterrupt 退不出来的结局方法

转载于:https://www.cnblogs.com/one-tom/p/10695236.html

weixin_34318956的博客 703

【RT-DETR改进涨点】ResNet18、34、50、101等多个版本移植到ultralytics仓库(RT-DETR官方一比一移植)

本文是本专栏的第一篇改进,我将RT-DETR官方版本中的ResNet18、ResNet34、ResNet50、ResNet101移植到ultralytics仓库,网上很多改进机制是将基础版本的也就是2015年发布的ResNet移植到ultralytics仓库中,但是其实RT-DETR实验的ResNet和其是有很大区别的在其中有很多细节上的不同(文章中我也会列出举例)

Snu77的博客 7220

解决gcc的keyboardInterrupt

在安装gcc的时候,使用源码安装:出现了

走在奋斗的路上 2823

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 402

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 232

Python+Agent入门笔记(二):列表推导式、模块和异常,这些写 Agent 前得会

接上一篇《Python+Agent入门笔记(一)》。基础语法跑通之后,这篇聊几块日常写脚本绕不开的东西。还是按 JS/Go 开发者的视角写,尽量记录我实际卡过的地方。

qq_41241612的博客 430

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 423

详解Python条件语句

在 Python 中,if...else 是一种条件语句,可以根据给定的条件执行不同的操作。这个语句通常用于控制程序的流程。

2601_96798737的博客 205

Python3 协程:异步编程的核心机制与实战

协程是解决I/O密集型任务等待瓶颈的高效机制,相比线程更轻量、无锁开销。从yield到async/await的演进,使异步编程语义清晰、易于理解。通过async/await可实现并发执行多个任务(如gather、create_task),显著提升网络请求、爬虫等场景性能。关键在于使用异步库(如aiohttp)替代同步库,避免阻塞事件循环。合理控制超时与并发数,才能发挥协程最大优势。

Lxn2zh的博客 159

python如何控制浏览器

Python 可以通过 Selenium、Playwright 等工具实现浏览器自动化,从打开网页到执行复杂交互操作均可脚本化完成。Selenium生态成熟

2601_96797912的博客 76

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 267

torch.compile 差异仅 1e-6,边界样本预测为何翻转

torch.compile 加速后输出与 eager 不一致,部分预测翻转。逐层对比与 graph break 分析定位到动态分支翻转根因。容差回归仅适用于无分支翻转场景,零容忍场景应禁用编译。

昨日种种,皆成今我。今日种种,皆成新我。 159

Python 100讲课程导航:第08篇《Python input 与类型转换:构建可靠的交互程序》

本文详解Python中input()的返回类型为字符串,强调必须通过int()、float()等函数进行类型转换。重点讲解了输入验证的重要性,结合try-except处理ValueError等异常,实现可靠的交互程序。通过购物预算计算器实战,演示如何防范非法输入、处理边界值,并推荐使用Decimal避免浮点精度问题,提升程序健壮性。

铭渊老黄 134

【Python】国家中小学智慧教育平台电子教材批量下载与 PDF 合成实战

成果:两本语文电子课本(一年级上册 118 页 / 23MB、三年级上册 130 页 / 30.3MB),合计 248 页、约 54MB,单本下载加合成 40~60 秒,PDF 页数校验全部通过。经验教训SPA 站点的数据接口优先从 bundle 里挖,比抓页面稳得多;资源链接要按 private/public 分组看待,只取平台公开部分;页数、目录名这类“可推断”的信息,永远用实际响应验证一次;受限环境里“能不能跑浏览器”要在方案定稿前确认。后续计划:这版 PDF 是图片版,没有文字层;

木头大左的博客 129
上一篇: LWN:关于printk()的讨论!
下一篇: LWN: 6.1 合并窗口第一部分!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值