[ASP.NET Debugging BuggyBits读书笔记] Lab02 Crash

原文来自:http://blogs.msdn.com/b/tess/archive/2008/02/11/net-debugging-demos-lab-2-crash-review.aspx

1. 打开command-line prompt转到WinDbg目录,执行 adplus –crash –pn w3wp.exe –quiet

2. 在Review.aspx页面里点击Refresh按钮,将触发w3wp.exe进程的crash

3. 打开EventViewer,查看System.evt,找到事件记录:

image

可见进程被终止,是因为发生了0xe0434f4d错误,而该错误是CLR错误在系统层面的统一称呼。

查看 Application.evt,找到事件记录:

image

可见系统接收到了System.NullReferenceException错误。

image

可见是Review类型的Finalize()方法抛出了NullReferenceException。

4. 用WinDbg打开2nd chance的.dmp文件。

5. 执行 .loadby sos.dll mscorwks,执行 !pe 查看错误。执行 !dso 查看与该thread相关的所有object。

image

可以发现,在所有抛出NullReferenceException的对象里,只有一个object的地址为026f4d1c,因此怀疑它才是真正抛出错误的对象。

6. 执行 !pe 026f4d1c ,得到结果如下:

image

可以看到与该exception相关联的方法是Review类型的Finalize()方法。

7. 可以发现该Fucntion所处的IP(Instruction pointer)是063B0f54,执行 !u 063B0F54:

image

可以发现063B0f54的位置介于063b0f53和063bf55之间,这里正好是执行063b0f53指令的地方,尝试把指针[ecx]的内容赋值给eax,而ecx的内容等于esi+4所指向的对象的内容。结合NullReferenceException,可以得知,esi+4指向的内容为空,所以该空值赋值给ecx以后,这是程序所访问的地址空间就变成了[0],出现NullReferenceException。

8. 在托管程序中,esi指针通常是this指针,也就是说,这个指针指向的是Review类型的的一个对象,因此我们尝试去查看这个对象究竟包含哪些内容。执行 !do 026c15d8,得到该Review对象的内容:

image

可见,该对象偏置4以后(offset+4),是quote变量的值,其value值(该值指向了quote的内容的存放地点)被指为null,因此其地址值变为了00000000,如果尝试去访问0000000地址的值(命令为move ecx, dword ptr [esi+4]),就会抛出NullReferenceException

9. 查看源代码:

image

可见程序在对象不使用之后都会执行一个ClearReview()方法。

image

该方法的实际内容是将对象置位null(指针将变为0)。

对于托管对象而言,并不需要在使用之后进行析构,可是程序仍然进行了析构,其代码为:

image

这里程序将先进行ToString()然后再和string.empty进行比较,这里由于quote已经为空,所以执行ToString()的时候就会出现NullReferenceException.

转载于:https://my.oschina.net/u/587236/blog/119550

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值