使用 Windbg 分析一个 异步操作 引发的 Crash 异常

上周我们收到了一个客户的紧急求助,他们的一个 iis应用程序池 经历了频繁重启,即使从错误日志中也不得到任何有用的信息,异常信息如下:

System.NullReferenceException : Object reference not set to an instance of an object.
System.Web.ThreadContext.AssociateWithCurrentThread(Boolean)System.Web.HttpApplication.OnThreadEnterPrivate(Boolean)System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(System.Threading.SendOrPostCallback, System.Object)System.Web.LegacyAspNetSynchronizationContext.CallCallback(System.Threading.SendOrPostCallback, System.Object)System.Threading.Tasks.AwaitTaskContinuation.RunCallback(System.Threading.ContextCallback, System.Object, System.Threading.Tasks.Task ByRef)System.Threading.Tasks.AwaitTaskContinuation+<>c.b__18_0(System.Object)System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()System.Threading.ThreadPoolWorkQueue.Dispatch()

这种异常会杀掉进程,通过 google 搜索会发现这是 .NET 4.5 异步操作下的某种经典异常,大概就是说没有在合适的地方等待 Task, 参考:https://stackoverflow.com/questions/18759987/async-code-without-waiting-for-completion  ,参考如下代码:

var getDataTask = getData();if(some_condition == true) {return some_object;
}getDataTask.Wait();return getDataTask.result;

如果代码无意走了 if(some_condition == true) 路径并没有 Wait 后续的 getDataTask 就会抛出这种异常,现在的问题是堆栈信息太少,并不能找到异常的源头在哪里?

使用 windbg 分析

如果你有 crash 的 dump,用windbg就能挖到很多有价值的信息。

  1. File → Open Crash Dump

首先使用 windbg 打开 crash 文件,如下图:

65a286b7fd9409651d3ae68495a95c9b.png

从图中可以看到,windbg 已经告知我们当前有一个 CLR 异常。

  1. Symbols

虽然没有客户的 debug 符号,这里使用微软的符号服务器, srv*C:\symbols*http://msdl.microsoft.com/download/symbols; 如下图:

f15a69a5254397ff39d66def7fc0cb87.png
  1. 加载 SOS 扩展

在 windbg 命令窗口中输入  .loadby sos clr

  1. 异常分析命令

使用 windbg 自带的异常分析自动化命令 !analyze -v ,然后你会得到很多的 异常信息, 参见下图:

c6d25a200001def634e15f01d1b244fe.png

上面的图中会告诉我们出问题的线程,接下来我们怎么看是谁创建了 Task,它的源头在哪里?可以用 !dso 查看这个问题线程的所有栈对象。

0:069> !dumpstackobjects
OS Thread Id: 0x2d20 (69)
RSP/REG          Object           Name
r15              0000002031518d78 System.Threading.Thread
00000022C6EBE680 0000001db1a917a8 System.NullReferenceException
00000022C6EBE6A0 0000001db1a917a8 System.NullReferenceException
00000022C6EBE6F8 0000001db1a917a8 System.NullReferenceException
00000022C6EBE740 0000001db1a91c40 System.Threading.QueueUserWorkItemCallback
00000022C6EBE758 0000001db1a91ad0 System.Runtime.ExceptionServices.ExceptionDispatchInfo
00000022C6EBE760 0000001db1a917a8 System.NullReferenceException
00000022C6EBE780 0000002031518d78 System.Threading.Thread
00000022C6EBE788 0000001db1a91c40 System.Threading.QueueUserWorkItemCallback
00000022C6EBE790 0000001db1a917a8 System.NullReferenceException
00000022C6EBE7A8 0000001df1b95078 System.SByte[]
00000022C6EBE7B0 0000001df1392cc0 System.Threading.ContextCallback
00000022C6EBE7C0 0000001db1a917a8 System.NullReferenceException
00000022C6EBE880 0000001db1a91ad0 System.Runtime.ExceptionServices.ExceptionDispatchInfo
00000022C6EBE888 0000001db1a917a8 System.NullReferenceException
00000022C6EBE8A8 0000001db1a91c40 System.Threading.QueueUserWorkItemCallback
00000022C6EBE8B0 0000002031518d78 System.Threading.Thread
00000022C6EBE910 0000001df1392cc0 System.Threading.ContextCallback
00000022C6EBE920 0000001db1a917a8 System.NullReferenceException
00000022C6EBE928 0000001db1a91ad0 System.Runtime.ExceptionServices.ExceptionDispatchInfo
00000022C6EBE938 0000001db1a91cc8 System.Threading.ExecutionContext
00000022C6EBE940 0000001db1a91cc8 System.Threading.ExecutionContext
00000022C6EBE950 0000001df1392cc0 System.Threading.ContextCallback
00000022C6EBE990 0000002031518d78 System.Threading.Thread
00000022C6EBE9F0 0000001db1a91c40 System.Threading.QueueUserWorkItemCallback
00000022C6EBE9F8 0000001db1a91cc8 System.Threading.ExecutionContext
00000022C6EBEA60 0000001df1392c98 System.Threading.ThreadPoolWorkQueue
00000022C6EBEAB8 0000001fb114f2e8 System.Threading.TimerQueue
00000022C6EBEAD8 00000020314c0ae8 System.Threading.ThreadPoolWorkQueueThreadLocals
00000022C6EBEAE0 0000001df1392c98 System.Threading.ThreadPoolWorkQueue
00000022C6EBEB00 0000001db1a91c40 System.Threading.QueueUserWorkItemCallback
00000022C6EBEE18 0000001df19f8320 System.Web.Hosting.IIS7WorkerRequest

这里有很多我们感兴趣的对象,那源头自然要深挖栈底对象 System.Web.Hosting.IIS7WorkerRequest ,使用 !do xxx 命令。

3ee0c17b42180d991819402cee01cbc5.png

然后再挖里面的 _path_httpVerb 字段,继续使用 !do

38d4d4020f92e208bb14e4224ba279d1.png

从图中可以看到,线程的源头是从 POST /Account/Login 请求开始的。

总结

当把调查结果反馈给客户,几分钟后我收到了一封邮件,他们已经定位并解决了这个问题,据说是因为调用了第三方的 dll ,但这个 dll 并没有合理的实现 wait 所致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wxGlade的图标,原来是来自蒙德里安的名画!

一直用wxGlade做GUI的&#xff0c;今天突然发现它的图标和一副油画很像。 wxGlade的图标&#xff0c;图标的文件名竟然就叫做mondrian.ico 蒙德里安创造了很多这种纯粹的基本要素的作品&#xff0c;下面是其中之一&#xff0c;《构图》&#xff08;Composition 1929 - Piet Mon…

SAP HANA解读-2012 SAP商业同略会分享

7月26日和27日&#xff0c;我受邀参加了SAP在国家会议中心举办的“蕴韬略促转变共发展”为主题的中国商业同略会&#xff0c;下面就参会的一些感想和大家分享一下。 SAP中国商业同略会是第二次在北京举办&#xff0c;此次大会汇聚国内外知名商业领袖、企业高层、行业权威、专家…

java日期加减秒_Java日期——年、月、日、时、分、秒、周加减计算

Java日期——年、月、日、时、分、秒、周加减计算Java日期——年、月、日、时、分、秒、周加减计算1.Pom依赖joda-timejoda-time2.9.92.示例代码package com.example.demo.controller;import org.joda.time.DateTime;import java.text.SimpleDateFormat;import java.util.Date;…

不可思议!这篇全篇脏话的文章竟然发表了

全世界只有3.14 % 的人关注了爆炸吧知识一教授为了抗议三流科学杂志发送垃圾邮件&#xff0c;回复了一篇全文只重复七个脏话字眼的论文&#xff0c;竟被出版&#xff01;这是十几年前&#xff0c;麻省理工大学的一个教授埃迪科勒&#xff0c;发表的一篇名为 Get me off Your Fu…

设置圆角、定向设置圆角-按钮等控件

为什么80%的码农都做不了架构师&#xff1f;>>> //定向设置圆角UIBezierPath *maskPath [UIBezierPath bezierPathWithRoundedRect:whiteView.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10, 10)];CASha…

C# 10 新特性 —— Lambda 优化

C# 10 新特性 —— Lambda 优化IntroC# 10 对于 Lambda 做了很多的优化&#xff0c;我们可以在 C# 中更加方便地使用委托和 Lambda 了&#xff0c;下面就来看一些示例Lambda EnhancementsNatural types for lambdasC# 10 可以更好做类型推断&#xff0c;很多时候编译器可以自动…

40个最好的Tumblr主题

如果安装了一款较好的Tumblr主题&#xff0c;你的Tumblr空间将焕然一新。然而找到一款合适的主题并不是一件容易的事&#xff0c;这正是本文中我整理那么多优质的Tumblr模板作为灵感的原因。其中有一些免费的Tumblr主题&#xff0c;另外的一些付费的Tumblr主题也确实很棒&#…

现代女性都有哪些烦恼?

1 医生&#xff0c;咱可以先拔下来么&#xff01;▼2 靓仔&#xff0c;我笑得停不下来&#xff01;&#xff08;via.豆瓣哈组&#xff09;▼3 边做饭边把锅给洗了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 令人无路可退的辞职方式&#xff01;&#xff1f;&…

c++11新特性(4) lambda捕捉块

lambda表达式中的方括号成为捕捉块,能够在这里指定怎样从所在的作用域中捕捉变量. 捕捉的意思是指能够在该lambda中使用该变量.即能够捕获外部变量在lambda表达式内使用. 能够使用两种方式来捕捉所在的作用域中的全部变量. []:通过值捕捉全部变量 [&]:通过引用捕捉全部变量…

别不承认!搞懂那些数理原理,才发现它们和枯燥根本不沾边!

▲ 点击查看数理化的学习对于很多孩子&#xff0c;包括家长都是一个大难题。比如&#xff0c;我们要教孩子认识动物&#xff0c;一般是要给孩子看动物的图片或实体&#xff0c;孩子自然就对这个动物有个认知。要教孩子数字&#xff0c;就会用一件玩具、两个苹果这种和现实有关联…

WPF实现数据拾取器

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织由于在WPF中没有现成的数据拾取器控件&#xff0c;所以我们自己实现一个。PS&#xff1a;有更好的方式欢迎推荐。01—代码如下一、创建 RoundPicker.cs 继承 Control代码如下。RoundPicker.cs实现…

CAS的安装与配置(一)服务器端配置

一、搭建Java Web服务器环境 CATALINA_HOME D:\Java\apache-tomcat-6.0.14 安装完毕&#xff0c;启动Tomcat &#xff0c;在浏览器上 测试 http://localhost:8080/ 出现上述界面&#xff0c;表明系统成功搭建。 二、使用Java Keytool工具为系统生成HTTPS证书&#xff0c;并…

某大型银行深化系统之十六:性能设计之一

传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 1队列服务质量评估 通过引入排队系统&#xff0c;定义系统中各项业务流程的产生和业务服务模型&#xff0c;描述工作项产生规律和服务规律的概率来计算系统的性能。 在对排队进行分析时&#xff0c;…

Android之React native的介绍和入门指南

链接&#xff1a;http://zhuanlan.zhihu.com/FrontendMagazine/19996445数月前&#xff0c;Facebook 对外宣布了正在开发的 React Native 框架&#xff0c;这个框架允许你使用 JavaScript 开发原生的 iOS 应用——就在今天&#xff0c;Beta 版的仓库释出了&#xff01; 基于 P…

清华教授转述:读博6年未毕业被认定为自控力不够,或将影响个人贷款额度

全世界只有3.14 % 的人关注了爆炸吧知识图片来源&#xff1a;网络来源&#xff1a;募格课堂、微博人文清华、中国教育报、学位与写作据清华大学“人文清华”讲坛官方微博人文清华发布&#xff0c;清华大学公共管理学院院长江小涓教授在一次演讲中透露&#xff0c;互联网银行工作…

缕一缕c#可null类型

在古时候&#xff0c;引用类型是的默认值就是null&#xff0c;值类型是不可以赋值null的&#xff0c;所以那时候&#xff0c;“未将对象引用到实例”这个错误&#xff0c;是引用类型的。后来&#xff0c;值类型也可以赋值null了&#xff0c;只要在值类型变量定义的时候&#xf…

Android之Windows下搭建React Native Android开发环境(差不多搞了一天)

Android之Windows下搭建React Native Android开发环境 穷逼买不起mac,但是他们都说React Native Android只能在mac下面运行,然后到网上各种找资料看能不能在Windows下面搭建开发环境,找了几篇,但是讲得不够详细,没有图片,很虚,然后我用自己的小米手机尝试了…

这6部顶级数学纪录片,告诉你数学一点都不无趣!

全世界只有3.14 % 的人关注了爆炸吧知识丘成桐曾说&#xff0c;“中国数学发展很快&#xff0c;但距离欧洲和美国还有相当大的差距”&#xff0c;在美国排名前20的顶尖大学里&#xff0c;包括哈佛大学、普林斯顿大学、斯坦福大学、加州大学伯克利分校等&#xff0c;具有国际一流…

JAVA兔子繁衍_Java 编程经典案例之兔子繁殖迭代问题

题目有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问第6个月的兔子总数为多少&#xff1f;分析首先我们要明白题目的意思指的是每个月的兔子总对数&#xff1b;假设将…

C# GTS四轴运动控制器实例(固高科技步进电机不带编码器) -V1

注&#xff1a;由于电机不带编码器&#xff0c;无法做home和当前位置信息读取&#xff01;功能&#xff1a;三个轴的点位运动&#xff1a;前进后退&#xff0c;并分别显示每个轴的移动脉冲数(可以换算为距离)&#xff01;开发环境&#xff1a;VS2017硬件设备&#xff1a;固高科…