记一次 .NET某列控连锁系统 崩溃分析

这篇具有很好参考价值的文章主要介绍了记一次 .NET某列控连锁系统 崩溃分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:背景

1. 讲故事

过年喝了不少酒,脑子不灵光了,停了将近一个月没写博客,今天就当新年开工写一篇吧。

去年年初有位朋友找到我,说他们的系统会偶发性崩溃,在网上也发了不少帖子求助,没找到自己满意的答案,让我看看有没有什么线索,看样子这是一个牛皮藓的问题,既然对方有了dump,那就分析起来吧。

二:WinDbg分析

1.为什么会崩溃

不管是 windows 还是 linux 上的.net程序崩溃都会存在异常码,前者是ExceptionCode,后者是 SignalCode,所以先用 !analyze -v 观察看看。


0:003> !analyze -v
CONTEXT:  (.ecxr)
eax=00000008 ebx=00639498 ecx=00000001 edx=0c75e4c8 esi=0063ec88 edi=083d8f77
eip=71ecaf96 esp=1ad2fa00 ebp=1ad2fa58 iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010202
clr!SVR::gc_heap::mark_object_simple1+0x382:
71ecaf96 f70000000080    test    dword ptr [eax],80000000h ds:002b:00000008=????????
Resetting default scope

EXCEPTION_RECORD:  (.exr -1)
ExceptionAddress: 71ecaf96 (clr!SVR::gc_heap::mark_object_simple1+0x00000382)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000001
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 00000008
Attempt to read from address 00000008

从卦中信息看,程序崩在 clr!SVR::gc_heap::mark_object_simple1 方法里,这表示当前gc触发时clr在托管堆标记对象时发现堆损坏了,那到底是不是托管堆损坏呢?可以用 !verifyheap 命令验证下,输出如下:


0:003> !verifyheap 
object 083d8f50: bad member 093D8F90 at 083D8F74
Last good object: 083D8F3C.
object 0c75e4c0: bad member 083D8F77 at 0C75E4C8
Last good object: 0C75E454.

从卦中信息看,确实存在着两个坏对象 083d8f500c75e4c0,接下来的研究重点就是为什么这两个对象会破坏?

2. 对象为什么损坏了

为了方便解读我们从 083d8f50 入手,先用 !do 观察它的布局。


0:003> !do 083d8f50
Name:        System.Windows.DependencyProperty
MethodTable: 727ebe60
EEClass:     72708570
Size:        44(0x2c) bytes
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
...
727e7f0c  40011fe       24 ....InsertionSortMap  1 instance 083d8f74 _metadataMap
...
0:003> !DumpVC /d 727e7f0c 083d8f74
Name:        MS.Utility.InsertionSortMap
MethodTable: 727e7f0c
EEClass:     72721ec8
Size:        12(0xc) bytes
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
727e7f44  40007e9        0 ...geSortedObjectMap  0 instance 093d8f90 _mapStore

0:003> !DumpObj /d 093d8f90
<Note: this object has an invalid CLASS field>
Invalid object

根据对象的布局知识,093d8f90 存放的是 mt,看样子是mt被损坏了,接下来用 dp 观察下这个地址的附近内存。


0:003> dp 093d8f90-0x20 L10
093d8f70  727e8b50 032e3750 1085da60 04a46fd9
093d8f80  00000000 727e8b50 032e3a48 08157ef0
093d8f90  03217272 00000000 727e8b50 032e353c
093d8fa0  08079f9c 02c028d2 00000000 727e8b50

0:003> !lno 093d8f90
Before:  093d8f84           20 (0x14)	MS.Internal.WeakEventTable+EventKey
After:   093d8f98           20 (0x14)	MS.Internal.WeakEventTable+EventKey
Heap local consistency confirmed.

0:003> !do 093d8f84
Name:        MS.Internal.WeakEventTable+EventKey
MethodTable: 727e8b50
EEClass:     727076c4
Size:        20(0x14) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_MSIL\WindowsBase\v4.0_4.0.0.0__31bf3856ad364e35\WindowsBase.dll
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
727ec0f4  4001a28        4 ....WeakEventManager  0 instance 032e3a48 _manager
7112dbd4  4001a29        8        System.Object  0 instance 08157ef0 _source
7112f6bc  4001a2a        c         System.Int32  1 instance 52523634 _hashcode

从卦中信息看 mt=03217272 肯定是不对的,但奇怪的是这附近的内存并没有损坏,它是EventKey._hashcode的16进制表示,我去,这就奇葩了。。。一下子陷入了迷茫。

3. 内存为什么没坏

说实话分析了这么多的dump,这种情况还是第一次遇见,根据上一节的分析,现在可以怀疑 093d8f90 这个地址本身就是错的,接下来观察它的所属地址 083d8f74 附近的内存。


0:003> dp 083d8f74 -0x40 L20
083d8f34  00000003 00000000 727e72c9 083d8ba4
083d8f44  083d8ec8 775e7de3 00000000 727ebe61
083d8f54  083d8ba4 0ec9e934 083d8ec8 083d8f20
083d8f64  00000000 00000000 00000000 00020368
083d8f74  093d8f90 00000000 727ee329 083d8ec8
083d8f84  0ec9eaf4 000000e0 00000000 727e7f45
083d8f94  083d8fa4 00000001 000000e0 00000000
083d8fa4  727e7fb1 00000002 083d8f04 000000e0

如果你仔细观察卦中的区域内存地址,你会发现一个有意思的现象,它附近的对象都是 083 开头的,凭什么它是 093 开头的?对他产生了怀疑之后,我们观察下托管堆中 mt=727e7f44 下是否存在 093d8f90 的实例,截图如下:

记一次 .NET某列控连锁系统 崩溃分析

从卦中可以清晰的看到确实不存在 093d8f90 对象,但存在一个将 9 -> 8 之隔的 083d8f90,有经验的朋友应该知道,这又是一例经典的bit位翻转导致的程序崩溃,可以用 .formats 命令观察下二进制的布局:

记一次 .NET某列控连锁系统 崩溃分析

4. 另一个坏对象也是如此吗

刚才的 093d8f90 我们搞明白了是由于bit位翻转导致,那 083d8f77 也是如此吗?有了刚才的经验这个就比较好验证了,可以查一下 mt=727ee328 下是否有这个实例。


0:003> !do 0c75e4c0
Name:        System.Windows.Media.Pen
MethodTable: 6f38a110
EEClass:     6f1568b4
Size:        40(0x28) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_32\PresentationCore\v4.0_4.0.0.0__31bf3856ad364e35\PresentationCore.dll
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
...
727ee328  40011dc        8 ...endencyObjectType  0 instance 083d8f77 _dType
...

0:003> !dumpheap -mt 727ee328
 Address       MT     Size
...
083d8db0 727ee328       20     
083d8f7c 727ee328       20     
...

记一次 .NET某列控连锁系统 崩溃分析

又是一个无语的结论,原来 083d8f7c 被错赋成了 083d8f77,用 .formats 命令观察之后发现有 3个bit的翻转。截图如下:

记一次 .NET某列控连锁系统 崩溃分析

三:总结

有丰富经验的朋友肯定知道,bit翻转大多是辐射导致计算机数字信号偶发的紊乱,这也是为什么医院要加个铅版来阻隔,而这个程序所处的环境刚好是辐射比较多的高铁系。

所以分析完之后,非我等调试师能为之,远离辐射。。。文章来源地址https://www.toymoban.com/news/detail-833976.html

记一次 .NET某列控连锁系统 崩溃分析

到了这里,关于记一次 .NET某列控连锁系统 崩溃分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记一次 .NET 某旅行社审批系统 崩溃分析

    前些天有位朋友找到我,说他的程序跑着跑着就崩溃了,让我看下怎么回事,其实没怎么回事,抓它的 crash dump 就好,具体怎么抓也是被问到的一个高频问题,这里再补一下链接: [.NET程序崩溃了怎么抓 Dump ? 我总结了三种方案] https://www.cnblogs.com/huangxincheng/p/14811953.html ,采用

    2024年02月09日
    浏览(34)
  • 记一次 .NET某新能源检测系统 崩溃分析

    前几天有位朋友微信上找到我,说他的程序会偶发性崩溃,一直找不到原因,让我帮忙看一下怎么回事,对于这种崩溃类的程序,最好的办法就是丢dump过来看一下便知,话不多说,上windbg说话。 对于一个崩溃类的dump,寻找崩溃点非常重要,常用的命令就是 !analyze -v ,输出如

    2024年02月08日
    浏览(30)
  • 记一次 .NET 某新能源材料检测系统 崩溃分析

    上周有位朋友找到我,说他的程序经常会偶发性崩溃,一直没找到原因,自己也抓了dump 也没分析出个所以然,让我帮忙看下怎么回事,那既然有 dump,那就开始分析呗。 一直跟踪我这个系列的朋友应该知道分析崩溃第一个命令就是 !analyze -v ,让windbg帮我们自动化异常分析。

    2024年02月05日
    浏览(41)
  • 记一次 .NET 某企业采购平台 崩溃分析

    前段时间有个朋友找到我,说他们的程序有偶发崩溃的情况,让我帮忙看下怎么回事,针对这种 crash 的程序,用 AEDebug 的方式抓取一个便知,有了 dump 之后接下来就可以分析了。 既然是程序的崩溃,我们可以像看蓝屏一下看dump文件,使用 !analyze -v 命令即可。 从上面的信息

    2024年02月11日
    浏览(41)
  • 记一次 .NET某股票交易软件 灵异崩溃分析

    在dump分析的旅程中也会碰到一些让我无法解释的灵异现象,追过这个系列的朋友应该知道,上一篇我聊过 宇宙射线 导致的程序崩溃,后来我又发现了一例,而这一例恰恰是高铁的 列控连锁一体化 程序,所以更加让我确定这是由于 电离辐射 干扰了计算机的 数字信号 导致程

    2024年02月04日
    浏览(30)
  • 记一次 .NET某工控 宇宙射线 导致程序崩溃分析

    为什么要提 宇宙射线 , 太阳耀斑 导致的程序崩溃呢?主要是昨天在知乎上看了这篇文章:莫非我遇到了传说中的bug? ,由于 rip 中的0x41变成了0x61出现了bit位翻转导致程序崩溃,截图如下: 下面的评论大多是说由于 宇宙射线 ,这个太玄乎了,说实话看到这个 传说bug 的提法

    2024年02月04日
    浏览(29)
  • 记一次 腾讯会议 的意外崩溃分析

    前段时间在用 腾讯会议 直播的时候,居然意外崩溃了,还好不是在训练营上课,不然又得重录了,崩完之后发现 腾讯会议 的 bugreport 组件会自动生成一个 minidump,截图如下: 作为一个.NET高级调试的技术博主,非 .NET 的程序也得要研究研究哈😄😄😄,有了这个好奇心,也

    2023年04月20日
    浏览(65)
  • 记一次 .NET 某工控视觉系统 卡死分析

    前段时间有位朋友找到我,说他们的工业视觉软件僵死了,让我帮忙看下到底是什么情况,哈哈,其实卡死的问题相对好定位,无非就是看主线程栈嘛,然后就是具体问题具体分析,当然难度大小就看运气了。 前几天看一篇文章说现在的 .NET程序员 不需要学习 WinDbg ,理由就

    2024年02月12日
    浏览(34)
  • 记一次 .NET某报关系统 非托管泄露分析

    前段时间有位朋友找到我,说他的程序内存会出现暴涨,让我看下是怎么事情?而且还告诉我是在 Linux 环境下,说实话在Linux上分析.NET程序难度会很大,难度大的原因在于Linux上的各种开源工具主要是针对 C/C++, 和 .NET 一毛钱关系都没有,说到底微软在 Linux 上的调试领域支持

    2024年02月14日
    浏览(36)
  • 记一次 .NET 某电力系统 内存暴涨分析

    前些天有位朋友找到我,说他生产上的程序有内存暴涨情况,让我帮忙看下怎么回事,最简单粗暴的方法就是让朋友在内存暴涨的时候抓一个dump下来,看一看大概就知道咋回事了。 这个问题说的再多也不为过,一定要看清楚这个程序是如何个性化发展的,可以使用 !address

    2024年02月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包