某日被告知文件没有生成,发现文件生成服务(WCF寄宿windows服务)异常阵亡。(服务监控没到位啊→ →)还好那个服务器的设置了发生异常dump内存镜像,收集了当时的尸体,同时Windows事件提示发生了堆栈溢出。
虽然(宇宙第一IDE)VS可以调试dump文件,但是还是有一些问题,比如说
64位调试器花费的时间比预期的要长
通过百度谷歌了一些解决方案,但是都没有作用,因为他就是花费时间长,晾旁边过了几个小时,切过去的时候竟然发现dump文件读取完成了。
然而接下来的操作依旧令人痛苦,切换一个线程也要等上几十分钟,还有就是日常符号加载问题。
这种时候只能寻求别的工具的帮助了。x64dbg,抱歉不支持.net,Ida,我插件没装全,也看不了.net,只剩下Windbg了。
Windbg其实装起来还挺麻烦的,是通过windows sdk附属安装的,我这里装的是win7的,然而win7那个镜像安装会因为当前.net版本过高导致symbol部分安装失败(建议装win7 sp1前装,不然要去注册表里修改.net版本,微软社区里有,链接找不到了)。win8的只有网络安装包,那个会因为网络问题,还有微软丢失文件问题,安装过程异常痛苦(当然也有独立压缩包(绿色
Windbg调试.net官方指南
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugging-managed-code
https://blogs.msdn.microsoft.com/kaevans/2011/04/11/intro-to-windbg-for-net-developers/
然而软爹经常教书教一半,剩下一半不知道写在哪里的文档里。Windbg默认进入入当前挂掉的线程。换线程要点工具栏里的线程子窗口,选择别的线程。
总结一下。1、加符号文件路径
.sympath+ srv*d:\symbols*http://msdl.microsoft.com/download/symbols .sympath+ d:\project\bin\debug
2、增加提示
!sym noisy
3、载入服务器上的.net库dll(这个位置C:\Windows\Microsoft.NET\Framework64\v4.0.30319,4.0以下是mscorwks.dll,不是clr.dll)。建议按x86、x64,还有4.0、4.5版本分开,把文件夹下一大堆文件mscorwks.dll、clr.dll什么的全部拿过来
.load d:\remotedll\x64__4.0.30319.01\sos.dll # 这两个经常载入不成功,其实并不要紧,可能是32位和64位的原因 # 这两个其实也没有必要载入 .load d:\remotedll\x64__4.0.30319.01\clr.dll .load d:\remotedll\x64__4.0.30319.01\clrjit.dll
4、载入符号文件
.reload /fi
5、傻屌windbg有时会乱搞文件路径,重新加载某些文件
.reload /i xx.dll
6、查看.net堆栈
!clrstack
windbg 刷刷刷打印了9k多行堆栈全指向一行,原来前人写的循环刷新读取配置文件的线程写炸了,果断改成Timer。