【问题标题】:CLR thread blocks on exception异常时 CLR 线程块
【发布时间】:2014-07-21 20:44:59
【问题描述】:

我正在尝试调试一个非常奇怪的问题。我的 C# 应用程序死锁,我正在使用 WinDbg 找出发生了什么。

似乎有一个线程在异常中被阻塞:

0:042> !mk  
Thread 42:
    SP       IP
00:U 0abeda7c 76eb015d ntdll!NtWaitForMultipleObjects+0x15  
01:U 0abeda84 754f15e9 KERNELBASE!WaitForMultipleObjectsEx+0x100  
02:U 0abedb20 750e19fc kernel32!WaitForMultipleObjectsExImplementation+0xe0  
03:U 0abedb68 750e41d8 kernel32!WaitForMultipleObjects+0x18  
04:U 0abedb84 75108074 kernel32!WerpReportFaultInternal+0x186  
05:U 0abedbf0 75107f33 kernel32!WerpReportFault+0x70  
06:U 0abedc04 75107828 kernel32!BasepReportFault+0x20  
07:U 0abedc14 751077a7 kernel32!UnhandledExceptionFilter+0x1af  
08:U 0abedca0 76f074ff ntdll!__RtlUserThreadStart+0x62  
09:U 0abedca8 76f073dc ntdll!_EH4_CallFilterFunc+0x12  
0a:U 0abedcbc 76f07281 ntdll!_except_handler4+0x8e  
0b:U 0abedce4 76eeb499 ntdll!ExecuteHandler2+0x26  
0c:U 0abedd08 76eeb46b ntdll!ExecuteHandler+0x24  
0d:U 0abedd2c 76eeb40e ntdll!RtlDispatchException+0x127  
0e:U 0abeddb8 76ea0133 ntdll!KiUserExceptionDispatcher+0xf  
0f:M 0abee104 0654c0bb MyApp.Raster`1[[System.UInt64,mscorlib]].RemoveSubset(System.Nullable`1<UInt64>, System.Nullable`1<UInt64>)(+0x5b IL,+0x103 Native)  

...

我不确定为什么线程阻塞而不是抛出异常。
我加载了 SOS.dll 和 SOSex.dll 并使用了 !PrintException 命令:

Exception object: 3f8c328c  
Exception type:   System.NullReferenceException  
Message:          Object reference not set to an instance of an object.  
InnerException:   <none>  
StackTrace (generated):  
SP       IP       Function  
0ABEE104 0654C0BB UNKNOWN!MyApp.Raster`1[[System.UInt64, mscorlib]].RemoveSubset(System.Nullable`1<UInt64>, System.Nullable`1<UInt64>)+0x103  

你有过这样的经历吗?可能是什么原因?

谢谢。

【问题讨论】:

  • 显示代码和出错的地方可能会帮助您获得有意义的响应。

标签: c#-4.0 clr windbg


【解决方案1】:

它正在尝试终止您的应用,显示 Windows 错误报告崩溃对话框。很难猜出你为什么看不到它。当然,您的客户看到它的可能性不为零,创建了一个小型转储并将其发送给您以找出导致它的原因。好吧,你的 MyApp.Raster.RemoveSubset() 方法做到了。

只是不要永远让它走到这一步。在显示 WER 对话框时,您已经丢失了很多关于异常的有价值的信息。就像异常消息和神圣堆栈跟踪一样。只需为 AppDomain.CurrentDomain.UnhandledException 事件编写事件处理程序并记录或显示 e.UnhandledException.ToString() 的值。并在 Windows 必须这样做之前自行终止应用程序,Environment.Exit()。

【讨论】:

  • 汉斯,根据my research,信息还没有消失。你甚至可以创建LocalDumps Registry key while the dialog is displayed
  • 不完全是答案的重点。重点是不必看它。并避免将客户置于自己永远无法找到简单解决方法的境地。
  • 我在堆栈中有一个更高的异常处理程序应该捕获任何异常。不幸的是,我不允许共享代码。我会将事件处理程序添加到 AppDomain.CurrentDomain.UnhandledException 并看看会发生什么。
猜你喜欢
  • 1970-01-01
  • 2011-12-15
  • 2011-09-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 2011-12-16
  • 2012-06-13
  • 1970-01-01
相关资源
最近更新 更多