.NET 工控PCB巡检系统崩溃,是哪个环节或细节导致的问题?
摘要:一:背景 1. 讲故事 前些天训练营里的一位学员找到我,说他们的系统出现了崩溃,自己分析了遍也没找到是什么原因,让我帮忙看下怎么回事?dump拿到手后,接下来就上windbg分析。 二:崩溃分析 1. 为什么会崩溃 打开dump之后,win
一:背景
1. 讲故事
前些天训练营里的一位学员找到我,说他们的系统出现了崩溃,自己分析了遍也没找到是什么原因,让我帮忙看下怎么回事?dump拿到手后,接下来就上windbg分析。
二:崩溃分析
1. 为什么会崩溃
打开dump之后,windbg 会自动定位崩溃点,输出如下:
................................................................
................................................................
.........................................
Loading unloaded module list
...........................................
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(1cec.1984): Access violation - code c0000005 (first/second chance not available)
+------------------------------------------------------------------------+
| This target supports Hardware-enforced Stack Protection. A HW based |
| "Shadow Stack" may be available to assist in debugging and analysis. |
| See aka.ms/userhsp for more info. |
| |
| dps @ssp |
| |
+------------------------------------------------------------------------+
For analysis of this file, run !analyze -v
clr!WKS::gc_heap::find_first_object+0xea:
00007ff9`9faea3eb 833800 cmp dword ptr [rax],0 ds:00000461`0000085a=????????
从卦中的 find_first_object 函数来看,这是GC在寻找需要标记的对象时出现了空地址,即经典的 托管堆损坏 问题。。。为了验证可以使用 !verifyheap 命令,输出如下:
0:016> !verifyheap
Could not request method table data for object 00000296DB67CFC0 (MethodTable: 0000046100000858).
Last good object: 00000296DB67CEF0.
2. 为什么托管堆损坏了
从时间轴的角度来看,托管堆损坏 属于第二现场,第一现场是恶意的破坏现场,由于时间不能倒流,所以从dump中我们无法看到曾经发生过的事,那怎么办呢?有一个办法就是直接看 破坏现场,哈哈,这个是不是有点像法医学。。。
