0号事件何处来?

news2024/9/30 9:28:17

暑假开始,格蠹开始对NDB调试器的新一轮升级。研发团队里,有几位新的面孔,包括远程的志愿者,还有新来格蠹的实习生。

本地调试Linux应用是新增的一个较大功能。为了支持这个功能,我们特意把本来集成在ndstub模块中的Linux本地调试代码独立成ndu模块,以便可以同时为ndstub(远程连接)、ndb命令程序(本地命令行接口)和ndb图形前端使用。

代码调整之后,从Windows连接ndstub进行远程调试的功能不工作了。排除一些小问题后,一块大石头挡在面前:收到一个莫名其妙的0号事件。

Debug event 0 for 0.0
ERROR: failed to find process 0.
Unknown event number 0x00000000


event status 6
meta poll returned 0

观察收到的调试事件结构体,整个结构体的数据都是0。所以从事件ID,到进程ID、线程ID都变成了0,把调试引擎搞晕了。

起初,我以为是填写调试事件的代码有问题,但是跟踪一番,没有找到问题。

接下来,我准备深入跟踪传递调试事件的过程。目标机上使用gdb调试ndstub,主机上使用VS调试前端脚本。

这时,奇怪的现象发生了。当主机端通过socket发出poll调用时,超乎寻常的快速得到结果,而这个结果就是诡异的0号事件,而且gdb里的poll断点并没有命中。

跟踪过程中,还有一个奇怪现象,那就是感觉创建子进程的行为不是很顺利。

于是我扩大跟踪范围,对创建被调试进程的函数也设置断点。

在跟踪创建子进程的fork函数时,我感觉到眼前一亮,“哇,原来如此!”

    问题的诱因是字符串转换。Linux下的宽字符(wchar_t)是4字节,Windows下的宽字符(wchar_t)是2字节,同时还要支持普通的单字节char,而ndb要支持两个系统,所以字符串转换成了一件麻烦事情。

错误的过程是这样的。来自Windows主机的创建进程请求传递的是2字节的宽字符,而ndu的CreateProcessW函数接受的wchar_t,其内部又调用wcstombs转换为单字符,以便调用Linux本地API。

在CreateProcessW的某些版本里,使用自己编写的utf162ansi函数,可以把Windows的宽字符转为单字符,但是最近代码改动频繁,utf162ansi被改为wcstombs,于是转换失败,转出来的字符串是空串,这导致传给exec的主程序路径为空。

如果exec成功,那么fork出来的子进程(pid 14323)便会执行自己的新程序,也就是被调试进程。但是现在exec失败了,调用exec的代码打印了一句错误信息后没有做更多处理。

exec  failed with err=2

这导致新的子进程在父进程里继续奔跑。它跑到了本不该它跑的父进程逻辑,提前回复了创建进程请求。

主机端收到创建进程的回复后,继续发出gettargetinfo等请求,都被子进程给回复了。

当主机端调用poll请求时,目标机的原本工作线程执行好真正的创建新进程处理工作,再次回复创建进程请求。这导致主机端的poll请求立刻收到回复。但收到的结果并不是对poll的回复,而是第二次对创建进程请求的回复。

0708114745U#14320:<<<ndpcall getconnectioninfo, in 4, out 16, event 0, 0:0
0708114745U#14320:>>>ndpcall getconnectioninfo[5], in 4, out 16, hr 0x0
0708114745U#14320:<<<ndpcall createprocessw, in 48, out 24, event 0, 0:0
0708114745U#14320:creating process ""
0708114745U#14320:[ndt_createp]
[Detaching after fork from child process 14323]
0708114745E#14320:New Thread 14323 is created
0708114745E#14323:exec  failed with err=2
0708114745U#14323:Process "" is created with pid=0 ret 0
0708114745U#14323:>>>ndpcall createprocessw[11], in 48, out 24, hr 0x0
0708114745U#14323:<<<ndpcall gettargetinfo, in 0, out 1108, event 0, 0:0
0708114745E#14323:failed to open proc file /proc/version_signature for 2
0708114745U#14323:Machine type: aa64
0708114745U#14323:>>>ndpcall gettargetinfo[4], in 0, out 1108, hr 0x0
0708114745U#14323:<<<ndpcall getprocessorid, in 0, out 8, event 0, 0:0
0708114745U#14323:>>>ndpcall getprocessorid[6], in 0, out 8, hr 0x0
0708114929E#14320:waitpid on newly process 14323 got 0x27f�� signaled pid 14323
0708114929E#14320:set PTRACE_SETOPTIONS 0x48 for pid 14323 ret 0, errno 84
0708114929U#14320:process inited for 14323 ndstub

调试的逻辑本来复杂,这又是故障情况,看官可能晕了吧?

来个手工的时序图吧,左侧是目标机的14320号线程,右侧是主机的请求线程,中间是fork出来的14323号线程,本来它应该跑自己的/bin/ls程序的但是exec失败后,它子承父业,跑起了父线程的逻辑。

1fee9932e1601c9f3504a55b2c056853.png

Linux的fork和exec逻辑源自古老的unix,思想朴素,实现灵活,同时也狂野奔放,有时有意想不到的效果。描述这样的复杂问题,文字有点不够了,词不达意,不知道各位格友看懂没有?

7fc562f4593dc504676be3bd178e7c47.png

(写文章很辛苦,恳请各位读者点击“在看”,也欢迎转发)

*************************************************

正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生

扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以文章和有声读物

56384698e05a8cb1e521a3ddd99f58c6.png

也欢迎关注格友公众号

a892c4ee07c6d14cccfdb41f89992a79.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1913427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过一个 AI 产品的落地,掌握产品经理工作全流程

对于任何一家互联网公司来说&#xff0c;用户流失都是我们必须要关注的一个问题。 这篇文章&#xff0c;我就通过我一个预测用户流失的项目&#xff0c;带你了解一个 AI 产品从筹备到上线的全流程。 从中&#xff0c;你可以体会到 AI 产品经理的完整工作流程是什么&#xff0…

Science|N型半导体水凝胶(柔性半导体器件/柔性健康监测/导电水凝胶/柔性电子)

2024年5月2日,北京大学雷霆(Ting Lei)课题组在《Science》上发布了一篇题为“N-type semiconducting hydrogel”的论文。论文内容如下: 一、 摘要 水凝胶是一类具有可调机械性能、多样生化功能和良好离子导电性的生物界面材料,但由于缺乏半导体特性,使得水凝胶在电子学中…

气膜体育馆的空气质量控制系统智能化管理—轻空间

随着科技的不断进步&#xff0c;气膜体育馆在全球范围内得到了广泛应用。一个重要的原因是其先进的空气质量控制系统&#xff0c;这不仅提高了场馆内部环境的舒适度&#xff0c;也保障了使用者的健康安全。轻空间将详细探讨气膜体育馆的空气质量控制系统是如何实现智能化管理的…

阅读笔记——《Fuzz4All: Universal Fuzzing with Large Language Models》

【参考文献】Xia C S, Paltenghi M, Le Tian J, et al. Fuzz4all: Universal fuzzing with large language models[C]//Proceedings of the IEEE/ACM 46th International Conference on Software Engineering. 2024: 1-13.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&…

【实施】项目实施计划方案(Word原件2024)

软件实施方案 二、 项目介绍 三、 项目实施 四、 项目实施计划 五、 人员培训 六、 项目验收 七、 售后服务 八、 项目保障措施软件开发管理全套资料包清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&am…

基于Java的飞机大战游戏的设计与实现论文

点击下载源码 基于Java的飞机大战游戏的设计与实现 摘 要 现如今&#xff0c;随着智能手机的兴起与普及&#xff0c;加上4G&#xff08;the 4th Generation mobile communication &#xff0c;第四代移动通信技术&#xff09;网络的深入&#xff0c;越来越多的IT行业开始向手机…

数据结构--二叉树相关习题5(判断二叉树是否是完全二叉树 )

1.判断二叉树是否是完全二叉树 辨别&#xff1a; 不能使用递归或者算节点个数和高度来判断。 满二叉树可以用高度和节点来判断&#xff0c;因为是完整的。 但是完全二叉树前面是满的&#xff0c;但是最后一层是从左到右连续这种 如果仍然用这种方法的话&#xff0c;如下图…

亚马逊速卖通卖家必看:自养号测评策略,下单高效防关联全攻略

在跨境电商的激烈竞争中&#xff0c;自养号测评策略已成为众多卖家追求低成本、高效推广的优选路径。然而&#xff0c;其成功实施离不开一系列精心策划与严格执行的关键要素。以下是对这些核心条件的深入剖析&#xff0c;旨在指导您安全、有效地构建并运营自养号测评体系。 一、…

几行代码,优雅的避免接口重复请求!同事都说好!

往期精彩文章&#xff1a;拿客户电脑&#xff0c;半小时完成轮播组件开发&#xff01;被公司奖励500&#xff01; 背景简介 我们日常开发中&#xff0c;经常会遇到点击一个按钮或者进行搜索时&#xff0c;请求接口的需求。 如果我们不做优化&#xff0c;连续点击按钮或者进行…

网页视频提取在线工具

在互联网的海洋中&#xff0c;我们时常会遇到一些令人心动的视频&#xff0c;想要将其下载到本地&#xff0c;以便随时观看。然而&#xff0c;网页视频下载对于很多人来说&#xff0c;似乎是个复杂的过程。别担心&#xff0c;今天我就为大家带来一份详尽的网页视频下载教程&…

【限时删!绝命Coding助力秋招】Python实现Boss海投脚本

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

哪有什么「历史的垃圾时间」,有的只是你对自己的不诚实

时间不会服从任何人的管理&#xff0c;它只会自顾自地流逝。— 李笑来《把时间当作朋友》 hi&#xff0c;欢迎来到我的杂货铺。 最近有个概念火了&#xff0c;叫做「历史的垃圾时间」。 看了下相关的文章&#xff0c;大概是在宣扬奥地利派经济学家米赛斯关于历史的一段论述&a…

MQ四兄弟:如何保证消息顺序性

在当今的分布式系统架构中&#xff0c;消息队列&#xff08;MQ&#xff09;是不可或缺的组成部分。它们在确保系统组件之间高效通信方面发挥着关键作用。特别是在金融交易、物流跟踪等对消息处理顺序有严格要求的场景中&#xff0c;消息队列的顺序性保证显得更为重要。接下来&a…

计算机网络——网络层(概念及IP地址划分)

目录 网络层概念 网络层向上层提供的两种服务 虚电路 网络提供数据报服务 虚电路服务与数据报服务的对比 网络层的两个层面 分组传送到路由器的运作 对网络层进行分层 网际协议IP 虚拟互联网络 IP地址 IP地址及其表示方法 IP地址的计算方式 IP地址的结构 …

算法的时间复杂度(C语言)

1.时间复杂度的定义 在计算机科学中&#xff0c;算法的时间复杂度是一个函数&#xff0c;它定量描述了算法的运行时间。一个算法所花费的时间与其中语句的执行次数成正比列&#xff0c;算法中的基本操作的执行次数&#xff0c;为算法的时间复杂度 例1&#xff1a; 计算Func1…

Midjourney 如何使用参考图像来提升图像的准确性和相似度?

&#x1f9d9;&#x1f3fc;图像提示 &#x1f9d9;&#x1f3fc;‍♂️ 您可以使用图像作为提示的一部分来影响作业的构图、样式和颜色。图像提示可以单独使用&#xff0c;也可以与文本提示一起使用 - 尝试组合具有不同样式的图像以获得最令人兴奋的结果。 &#x1f6e0;️实…

合合信息大模型加速器重磅上线,释放智能文档全新可能

目录 0 写在前面1 高速文档解析引擎&#xff1a;拓宽大模型认知边界2 文本嵌入模型acge&#xff1a;克服大模型感知缺陷3 行业赋能&#xff1a;以百川智能为例总结 0 写在前面 随着人工智能技术的飞速发展&#xff0c;大模型以强大的数字处理能力和深度学习能力&#xff0c;不…

XTuner 微调 LLM:1.8B, 部署

扫码立刻参与白嫖A100&#xff0c;书生大模型微调部署学习活动。亲测有效 内容来源&#xff1a;Tutorial/xtuner/personal_assistant_document.md at camp2 InternLM/Tutorial GitHubLLM Tutorial. Contribute to InternLM/Tutorial development by creating an account on G…

帕金森病患者应该如何确定自己每天适宜的饮水量?

帕金森病患者确定每天适宜的饮水量时&#xff0c;应该考虑到药物副作用、运动障碍和便秘等问题。建议的饮水量通常是每天6至8杯水&#xff0c;相当于约2000毫升左右。这个量可以根据个人的体重、气候条件、活动水平以及是否有其他健康问题进行适当调整。 为了科学合理地安排饮水…

【CVPR 2024】GART: Gaussian Articulated Template Models

【CVPR 2024】GART: Gaussian Articulated Template Models 一、前言Abstract1. Introduction2. Related Work3. Method3.1. Template Prior3.2. Shape Appearance Representation with GMM3.3. Motion Representation with Forward Skinning3.4. Reconstruct GART from Monocu…