windbg调试.net小记

某日被告知文件没有生成,发现文件生成服务(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。

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注