.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中我们无法看到曾经发生过的事,那怎么办呢?有一个办法就是直接看 破坏现场,哈哈,这个是不是有点像法医学。。。
阅读全文