我的团队正在尝试查找.NET windows service
中出现错误消息的位置,该消息封装了一个由Microsoft构建并驻留在我们的服务器上的Web服务,以支持我们使用的业务产品。微软亲自告诉我们,我们收到的错误实际上是他们的错误之一,但他们无法确定它发生的地点或原因。这是一个关键的业务流程,给我们的团队带来了很多心痛。
就我们所知,这个错误是随机发生的,没有我们可以通过查看堆栈跟踪发现的共同点。堆栈跟踪的最后一次调用是我们的方法调用,试图从服务中读取响应,没有提示我们在对服务的方法调用中发生错误的位置或原因。 Microsoft Windows服务未将任何错误记录到事件查看器中。
我们希望通过查找正在抛出的文字错误消息字符串来跟踪此错误的来源。如果我们可以识别生成此错误的方法调用,我们可以更接近于缩小如何解决此错误。
虽然我们无法访问此服务的源代码,但我们可以使用IL反汇编程序(idlasm.exe)查看IL。我已经将IL转储给了一些程序集,但它们不是文字字符串。
是否可以在IL中找到文字字符串?我假设它是编码的 - 我只是不太了解IL来确定在哪里查看,或者如何识别IL中的字符串。如果它不是作为带有IL中的方法的文字字符串存在,并且存储在资源中,那么可以在哪里找到错误消息?
堆栈跟踪,替换了应用名称。
Raw Error: There is insufficient memory to execute this function.
This can be caused by recursive function calls. Contact your system administrator.
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at Product.DoSomething() in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\da35f853\f48bba34\App_WebReferences.jygjwt-a.0.cs:line 701
at Product.DoSomething() in E:\Sites\Example.com\App_Code\File.vb:line 1105
at ASP.shop_checkout_aspx.ProcessCheckout() in E:\Sites\Example.com\processcheckout.aspx:line 546
一些附注是在此错误消息时有足够的内存可用,并且当发生此错误时,对任何方法的每次后续调用都会返回相同的错误。它只会通过重新启动Microsoft服务来消退。
我们缩小了对我们网站所使用服务的每次调用,但无法重现此消息。我们可以在生产过程中使用大约1000倍的流量来重载开发中的服务,并导致内存不足异常(通过消耗所有内存),但不会出现由递归引起的消息“Can be
功能调用。“微软称Agian是他们的产品特别抛出的一个独特错误。
更新
我们设法在.etx
文件中找到了文字错误消息,如下所示:
// ÚÄÄÄÄÄÄÄÄÄ¿
// ÚÄ´ STACK ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
// ³ ÀÄÄÄÄÄÄÄÄÄÙ ³
// ³ ³
// ³ Stack Manager ³
// ³ ³
// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
@1@15@0@
@2@1@0@
There is insufficient memory to execute this function.
This can be caused by recursive function calls that are used in the program. Contact your system administrator.
@2@END@0@
我认为@1@15@0@
,@2@1@0@
和@2@END@0@
是程序集用来引用这些字符串的某种引用。有没有人有任何关于如何将这些信息绑定到使用这些字符串的程序集之一的信息?到目前为止,IL转储中似乎没有任何数据与@
符号的格式相匹配。
答案 0 :(得分:2)
您很可能需要查看电线的另一端以获取异常来源。别忘了,你正在使用肥皂。 SoapMessage.Exception属性在不为空时在SoapHttpClientProtocol.ReadResponse()内被抛出。
异常文本提示所谓的Soft Stack Overflow。当异步代码发现没有足够的堆栈空间来运行函数而不会导致硬堆栈溢出时抛出Windows异常代码0xe053534f(googles well)。
答案 1 :(得分:0)
与此同时,您可以简单地增加IIS工作器w3wp.exe的堆栈大小(使用editbin)。默认的堆栈大小非常小。
答案 2 :(得分:0)
这是一个StackOverflowException。在SOAP调用中缺少服务器端堆栈跟踪是一个死的赠品。