文章摘要
shell32.dll团队收到一个bug报告,称其导致某第三方程序大量崩溃。分析崩溃转储文件发现,堆栈溢出是根本原因,且异常处理过程中反复调用RtlLookupFunctionEntry和RtlDispatchException函数,形成了递归循环。
文章总结
好的,这是根据您的要求,对原文主要内容进行的中文重述,保留了关键细节,并删除了与主题无关的内容(如作者介绍和文章末尾的注释)。
标题:内存中消失的DLL(上篇)
负责shell32.dll的团队收到一个bug报告,称该DLL导致某第三方程序大量崩溃。分析崩溃转储文件后,发现了明显的栈溢出迹象:调用栈中反复出现从RtlLookupFunctionEntry到KiUserExceptionDispatch的循环,这表明程序陷入了递归异常处理的“死亡螺旋”。简单来说,一个异常发生后,内核将其反射回用户模式处理,但在寻找异常处理函数的过程中又触发了新的异常,如此循环往复,最终耗尽栈空间,导致进程终止。
由于调用栈底部显示,最初的异常发生在combase!CoTaskMemFree函数中,而该函数被shell32的析构函数调用,因此bug最初被归咎于shell32。
通过分析异常记录,发现异常代码是STATUS_ACCESS_VIOLATION(访问违规),具体原因是“试图执行不可执行的地址”,而这个地址正是combase!CoTaskMemFree。进一步检查内存状态发现,包含CoTaskMemFree函数的整个combase.dll模块所占用的内存已经被释放(状态为MEM_FREE,保护属性为PAGE_NOACCESS)。然而,在加载器的记录中,该DLL仍然存在,且其加载计数为0xFFFFFFFF,这意味着它本应被“固定”在内存中,不会被FreeLibrary正常卸载。
综合这些信息,可以推断:combase.dll并非通过正常的FreeLibrary流程被卸载,而是被某段代码通过VirtualFree等操作强制释放了内存。这很可能是一个内存损坏bug,例如某个变量被错误地覆写成了combase.dll的基地址,导致后续的清理操作误释放了该DLL占用的内存。
因此,问题的根源并不在shell32。shell32只是另一个受害者,它恰好是combase.dll被强制卸载后,第一个尝试调用其函数的DLL。
为了验证这个理论,作者调取了该第三方程序最近100次崩溃的数据,并进行了分类统计。结果显示,除了shell32相关的栈溢出(占11%),还有大量其他类型的栈溢出和访问违规崩溃。抽查后发现,这些崩溃的模式与shell32的bug如出一辙:都是在发送DLL_PROCESS_DETACH通知时,某个DLL发现已被强制卸载,而下一个调用该已卸载DLL的模块(可能是任何DLL)就成了替罪羊。总计有46%的崩溃都源于这个“恶意强制卸载DLL”的单一根本原因。这是一个典型的“桶状喷射”案例,即一个底层原因引发了多种不同表象的崩溃。
好消息是,shell32团队可以免责,他们是受害者。坏消息是,真正的罪魁祸首仍然未知。
评论总结
根据评论内容,主要观点和论据如下:
1. 对问题根源的赞赏与认可
- 评论1(defrost)高度评价了追踪“海森堡bug”的毅力,指出46%的崩溃源于一个流氓DLL强制卸载,属于“桶喷”现象。
- 关键引用:"That's some doggedly determined back tracing to uncover an unexpected heisenbug"
- "So a total of 46% of the crashes were due to this rogue force-unload of a DLL"
2. 对软件开发现状的感慨
- 评论2(zabzonk)引用原文,感叹“shell32团队是受害者,但不知罪魁祸首”,认为这反映了软件开发的普遍困境。
- 关键引用:"The good news for the shell32 team is that they are off the hook... The bad news is that we don’t know who the culprit is."
- "The story of software development through the ages."
3. 对Raymond Chen个人能力的钦佩与质疑
- 评论5(rwmj)和评论6(nopurpose)质疑微软支持政策,认为只有Raymond Chen这样的传奇人物才能处理此类问题,暗示第三方厂商需足够重要才能获得关注。
- 关键引用:"What MSFT support policy do you need to have the legendary Raymond Chen take a look at it?"
- "How big and important third-party vendor must be for Raymond Chen to dissect its coredumps?"
- 评论8(hackrmn)认为微软人手不足,Raymond Chen被当作“VIP顾问”处理最棘手问题,但担心他成为“过时开发者”。
- 关键引用:"The fact that Raymond Chen is debugging these kind of issues, tells me Microsoft is short on staff"
- "He is a legend, but he's becoming somewhat of a vintage developer."
4. 对Windows COM的批评
- 评论9(IChooseY0u)直言Windows COM“超级奇怪且过度设计”。
- 关键引用:"Windows COM is super weird and way over engineered."
5. 对崩溃报告价值的肯定
- 评论7(1970-01-01)赞赏微软利用崩溃报告进行数据分析,认为其提供了有价值的崩溃数据。
- 关键引用:"Always wondered if crash reporting is some kind of shady business... it does... give valuable crash data to MS."
6. 对AI诊断能力的调侃
- 评论10(antonvs)建议将信息喂给Claude AI,认为它能诊断并修复问题。
- 关键引用:"Feed the info and code to Claude, it'll diagnose and fix this."
平衡性总结:评论整体对Raymond Chen的调试能力表示钦佩,但质疑微软人才结构;肯定崩溃报告的价值,同时批评Windows COM的复杂性;部分评论对软件开发现状持悲观态度,也有评论调侃AI替代可能性。