记一次 .NET某上位视觉程序 离奇崩溃分析
一:背景
1. 讲故事
前段时间有位朋友找到我,说他们有一个崩溃的dump让我帮忙看下怎么回事,确实有太多的人在网上找各种故障分析最后联系到了我,还好我一直都是免费分析,不收取任何费用,造福社区。
话不多说,既然有 dump 来了,那就上 windbg 说话吧。
二:WinDbg 分析
1. 为什么会崩溃
说实话windbg非常强大,双击打开dump就能第一时间帮你显示出简略的异常信息,输出如下:
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(bf8.5dc4): Access violation - code c0000005 (first/second chance not available)
For analysis of this file, run !analyze -v
clr!WKS::gc_heap::mark_object_simple1+0x220:
00007ffb`380453c4 833a00 cmp dword ptr [rdx],0 ds:00007ffa`35451300=????????
从卦中又看到了经典的 mark_object_simple1
方法,这个方法是GC用来做对象标记之用的,所以大概率又是托管堆损坏,真是无语了,接下来用 !verifyheap
检查下托管堆。
0:083> !verifyheap
object 00000218e96963d8: bad member 00000218E9696450 at 00000218E9696420
Last good object: 00000218E96963C0.
Could not request method table data for object 00000218E9696450 (MethodTable: 00007FFA35451300).
Last good object: 00000218E96963D8.
一看这卦就很不吉利,真的是有对象的mt是不对的,至此我们把崩溃的直接原因给找到了。
2. 为什么对象损坏了
要找到这个答案就需要深挖 00000218e96963d8
对象,分别使用 !do
命令以及 dp
来观察内存地址。
0:083> !do 00000218e96963d8
Name: System.Threading.Tasks.Task+DelayPromise
MethodTable: 00007ffb3542b3e8
EEClass: 00007ffb3567c7c0
Size: 120(0x78) bytes
File: C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
...
00007ffb35451300 40035d5 48 ...m.Threading.Timer 0 instance 00000218e9696450 Timer
0:083> dp 00000218e9696450 L6
00000218`e9696450 00007ffa`35451301 00000000`00000000
00000218`e9696460 00000218`e96964c8 00000000`00000000
00000218`e9696470 00007ffb`353e4b51 00000218`e9696368
仔细观察卦中对象 00000218e9696450
所显示的mt,你会发现一个是 00007ffb35451300
,一个是 00007ffa35451301
,很显然前者是对的,后者是错的,可以分别用 !dumpmt
做个验证。
0:083> !dumpmt 00007ffb35451300
EEClass: 00007ffb356942f0
Module: 00007ffb353b1000
Name: System.Threading.Timer
mdToken: 0000000002000504
File: C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
BaseSize: 0x20
ComponentSize: 0x0
Slots in VTable: 23
Number of IFaces in IFaceMap: 1
0:083> !dumpmt 00007ffa35451301
00007ffa35451301 is not a MethodTable
细心的朋友会发现虽然两个mt地址不一样,但已经非常相近,看样子又是一例经典的bit位翻转,我去,用 .formats
转成二进制观察一下,截图如下:
从卦中可以清晰的看到当前地址有两个 bit 的翻转,分别是第0位
和第32位
,接下来就要洞察为什么会有两个bit位的翻转?
3. 真的存在两个bit位翻转吗
接下来我们逐一来聊一下。
- bit 0 为什么会翻转
熟悉 coreclr 底层的朋友应该知道,gc 在标记的过程中会给 mt 的第0位设置为1,表示当前对象在深度优先中已经标记过,防止重复标记,当然这个也是有源码作证的,简化后的代码如下:
inline BOOL gc_heap::gc_mark(uint8_t* o, uint8_t* low, uint8_t* high, int condemned_gen)
{
if ((o >= low) && (o < high))
{
BOOL already_marked = marked(o);
if (already_marked)
{
return FALSE;
}
set_marked(o);
return TRUE;
}
}
#define marked(i) header(i)->IsMarked()
BOOL IsMarked() const
{
return !!(((size_t)RawGetMethodTable()) & GC_MARKED);
}
有了这段源码,这个 bit 为什么为 1 就能轻松的解释了,所以这个翻转是一个正常情况。
- bit 32 为什么会翻转
这个是我无法解释的,也正是因为这个 bit32 的翻转导致 gc 认为这个 obj 是一个损坏的对象,到底是什么原因呢?民间众说纷纭,在我的过往分析旅程中我已见过两例,但我不敢确定自己又遇到了辐射类的奇葩情况,所以也第一时间找朋友确认程序周边是否存在辐射环境。
朋友反馈过来附近有 伺服电机
类,说实话工控的东西我是真的不太懂,只能上网搜搜这玩意是否有辐射,截图如下:
到底是不是这玩意导致的,其实我心里也没底,跟朋友的沟通后说是只出现过一次,这就更加玄乎了。
不管怎么说,我只能给出如下两个方案:
- 上 ECC 纠错内存
- 远离辐射环境
三:总结
在大工控领域里,这是我见过第三例bit位翻转导致的程序崩溃,太无语了,恶魔到底是不是旁边的 伺服电机
? 希望领域内的同行们留言讨论下,让我长长见识,感谢!
记一次 .NET某上位视觉程序 离奇崩溃分析的更多相关文章
- 记一次 .NET 某自动化集采软件 崩溃分析
一:背景 1.讲故事 前段时间有位朋友找到我,说他的程序在客户的机器上跑着跑着会出现偶发卡死,然后就崩掉了,但在本地怎么也没复现,dump也抓到了,让我帮忙看下到底怎么回事,其实崩溃类的dump也有简 ...
- 记一次 .NET 某教育系统API 异常崩溃分析
一:背景 1. 讲故事 这篇文章起源于 搬砖队大佬 的精彩文章 WinDBg定位asp.net mvc项目异常崩溃源码位置 ,写的非常好,不过美中不足的是通览全文之后,总觉得有那么一点不过瘾,就是没有 ...
- 记一次 .NET 某企业 ERP网站系统 崩溃分析
一:背景 1. 讲故事 前段时间收到了一个朋友的求助,说他的ERP网站系统会出现偶发性崩溃,找了好久也没找到是什么原因,让我帮忙看下,其实崩溃好说,用 procdump 自动抓一个就好,拿到 dump ...
- vc++MFC开发上位机程序
用vc++MFC开发过不少跟单片机通讯的上位机程序了.搞懂了MFC架构,开发还是很快的,与底层单片机程序通讯,可以用串口.usb.网络.短信形式.串口现在用的越来越少了,一般电脑跟单片机在一块,使用串 ...
- VC++编写简单串口上位机程序
VC++编写简单串口上位机程序 转载: http://blog.sina.com.cn/s/articlelist_1809084904_0_1.html VC++编写简单串口上位机程序 串口通信 ...
- 记一次 .NET 某医疗器械 程序崩溃分析
一:背景 1.讲故事 前段时间有位朋友在微信上找到我,说他的程序偶发性崩溃,让我帮忙看下怎么回事,上面给的压力比较大,对于这种偶发性崩溃,比较好的办法就是利用 AEDebug 在程序崩溃的时候自动抽一 ...
- 如何处理由Dll缺失造成的程序直接崩溃的问题。
问题描述:在开发一个上位机程序时(C#.winform),使用到了Kvaser的SDK,而这个SDK是基于对应的Kvaser驱动开发的.当前PC如果没有装Kvaser驱动, 程序启动时,会直接奔溃.调 ...
- [转]window下使用SetUnhandledExceptionFilter捕获让程序的崩溃
简单使用SetUnhandledExceptionFilter()函数让程序优雅崩溃 虽然是大公司的产品,QQ它还是会在我们的折腾下崩溃的,但是它总是崩溃的很优雅,还要弹出自己的对话框来结束.并且发送 ...
- window下使用SetUnhandledExceptionFilter捕获让程序的崩溃(转)
简单使用SetUnhandledExceptionFilter()函数让程序优雅崩溃 虽然是大公司的产品,QQ它还是会在我们的折腾下崩溃的,但是它总是崩溃的很优雅,还要弹出自己的对话框来结束.并且发送 ...
- Android将应用程序的崩溃信息如何保存到本地文件,并上传服务器
导语:最近实在是太忙了,没有怎么更新公众号,也没有怎么认真去写一些内容,在这里先给关注我的朋友说一声抱歉,可能在接下来的一段时间,还是很忙,但是我会争取抽空多分享一下技术文章,给大家看,共同进步,也希 ...
随机推荐
- Django RESTful API设计与实践指南
title: Django RESTful API设计与实践指南 date: 2024/5/14 15:37:45 updated: 2024/5/14 15:37:45 categories: 后端 ...
- C 语言编程 — 输入/输出与文件操作
目录 文章目录 目录 前文列表 输入/输出 scanf() 和 printf() getchar() 和 putchar() 文件操作 打开文件 关闭文件 写入文件 读取文件 二进制 I/O 函数 前 ...
- layui表单验证抽离成单独模块手动调用
模块名:validateForm 验证添加方法和原来一样(lay-verify=''),可以多个表单一起验证,任何任何一个验证不通过就会返回.使用: var boolResult = validate ...
- 【论文阅读】VulCNN受图像启发的可扩展漏洞检测系统
基本信息 摘要 由于深度学习(DL)可以自动从源代码中学习特征,因此已被广泛用于源代码漏洞检测.为了实现可扩展的漏洞扫描,一些先前的研究打算通过将源代码视为文本来直接处理源代码.为了实现准确的漏洞检测 ...
- linux基础之awk命令详解
一 awk主要是用来对指定对文本或者命令的输出逐行处理和分析的,下面来简单的看一下awk用法,方便以后需要使用的时候在回头看 1.1 基础的用法 [root@wxm ~]# cat test 1 ...
- 搭建一套完整的ELK系统
ELK日志收集系统介绍 一 简单介绍 ELK部署搭建有很多成型的方案,这里推荐一种比较中规中矩的方案,它整合了logstash比较消耗资源以及当服务端临时宕机的时候出现数据丢失的问题,主要由fi ...
- mysql in不走索引可能的情况
在MySQL 5.7.3以及之前的版本中,eq_range_index_dive_limit的默认值为10,之 后的版本默认值为200.所以如果大家采用的是5.7.3以及之前的版本的话,很容易采用索引 ...
- 利用docker 搭建File Browser 文件管理系统
File Browser就是一个文件浏览器,因为linux并不方便桌面管理,所以Filebrowser就是帮助我们管理linux服务器上文件的程序,你可以称他为网盘程序,可以管理文件.可以分享文件,另 ...
- docker使用Open Policy Agent(OPA)进行访问控制
目录 一.系统环境 二.前言 三.Open Policy Agent 简介 四.Rego 语言简介 五.配置基本环境 六.docker安装OPA插件 6.1 安装docker 6.2 docker安装 ...
- React事件处理 事件绑定 事件对象
React 元素的事件处理和 DOM 元素的很相似,但是有一点语法上的不同: React 事件的命名采用小驼峰式,而不是纯小写. onClick onChange 使用 JSX 语法时你需要传入一个 ...