为什么大量的AppSettings调用不存在的密钥会导致应用程序崩溃?

时间:2012-05-23 10:12:39

标签: .net vb.net exception windows-services crash

我正在研究的Windows服务存在一个非常奇怪的问题,我想了解它为什么会发生。

服务每5分钟循环一次,然后在该循​​环内循环遍历包含编号如下的web服务URL的密钥:

<add key="URL.1" value="http://dummy1.com/Service.asmx"/>
<add key="URL.2" value="http://dummy2.com/Service.asmx"/>
<add key="URL.3" value="http://dummy3.com/Service.asmx"/>

执行此检查的代码是:

If String.IsNullOrEmpty(AppSettings("OM." & intCount & ".Name").ToString) Then

当它命中一个不存在的键时,抛出异常并且服务停止并等待5分钟直到下一个循环。

这通常很有效,但是每隔一两周,Windows服务就会在该行上崩溃而不会出现任何异常。应用程序日志在该行之前有一行但之后没有任何一个Try Catches被击中(主要的是捕获基础“异常”类)。

在Windows的事件日志中有以下内容:

Faulting application name: MyService.exe, version: 1.1.2.0, time stamp: 0x4fa22a24
Faulting module name: KERNELBASE.dll, version: 6.1.7601.17651, time stamp: 0x4e211319
Exception code: 0xe053534f
Fault offset: 0x0000b9bc
Faulting process id: 0x%9
Faulting application start time: 0x%10
Faulting application path: %11
Faulting module path: %12
Report Id: %13

奇怪的是,这行代码每天执行300次,至少持续一周,大约是2000次,之后一次导致应用程序完全崩溃。

为什么会出现这种情况?我已经改变了那行代码而不依赖于Exceptions并且它已经运行了一个星期而没有崩溃,所以可能与太多的异常有关 - 可能导致堆栈溢出?

1 个答案:

答案 0 :(得分:1)

  

异常代码:0xe053534f

您的程序因此网站名称而崩溃。异常代码的最后3个十六进制对是“SSO”的ascii代码。这意味着“软堆栈溢出”。除了早期检测到它之外,它与硬堆栈溢出异常是一回事。在设置调用时,CLR注意到实际进行调用会导致硬堆栈溢出。

你的程序会像在硬盘StackOverflowException上那样崩溃,它是一个没有catch块或AppDomain.UnhandledException被执行的立即中止。

你的程序究竟是如何遭受这种命运的,这个问题无法解决。这是一个典型的编程错误。