本文介绍: 这次生产事故,我感觉用户和CLR都有责任,托管线程的栈空间都释放了,为什么 CLR 在触发 GC 时还要去爬它的栈导致崩溃的发生,这真的是一个很有意思的dump。
一:背景
1. 讲故事
上周有位朋友找到我,说他的程序经常会偶发性崩溃,一直没找到原因,自己也抓了dump 也没分析出个所以然,让我帮忙看下怎么回事,那既然有 dump,那就开始分析呗。
二:Windbg 分析
1. 到底是哪里的崩溃
一直跟踪我这个系列的朋友应该知道分析崩溃第一个命令就是 !analyze -v
,让windbg帮我们自动化异常分析。
从卦中的调用栈来看,有如下两点信息:
上面的mark_phase
表示当前 GC 正在标记阶段,后面的GcScanRoots
表示 GC正在线程栈上寻找根对象。
看到崩溃在clr的 clr!Frame::HasValidVTablePtr
方法中真的有点不敢相信,从崩溃点的汇编代码 rdi,qword ptr [rcx]
来看,貌似 rcx 没有分配到物理内存,可以用 !address rcx
验证下。
尼玛,真的好无语,这个rcx=00000039cccff2d8
所处的内存居然是一个 MEM_FREE,访问它自然会抛异常,现在很迷茫的是这玩意是 GC 的内部逻辑,按理说不会有这种异常,难道是 CLR 自己的 bug 吗?
三: 真的是 CLR 的 bug 吗
1. 分析 CLR 源码
2. frame来自于哪里
3. 寻找问题 Thread
4. 778号线程是何方神圣
四:总结
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。