7

私のチームは、.NET 内でエラー メッセージが発生している場所を見つけようとしています。.NET はwindows service、Microsoft によって構築され、私たちのサーバー上に存在する Web サービスをカプセル化し、私たちが使用するビジネス製品をサポートします。Microsoft は、私たちが受け取ったエラーは実際にはエラーの 1 つであると個人的に語っていますが、それがどこで、なぜ発生しているのかを特定することはできません。これは重要なビジネス プロセスであり、私たちのチームに多大な苦痛をもたらします。

このエラーは、私たちが知る限り、ランダムに発生し、スタック トレースを調べて発見できる共通点はありません。スタック トレースの最後の呼び出しは、サービスからの応答を読み取ろうとするメソッド呼び出しであり、サービスへのメソッド呼び出し内でエラーが発生している場所や理由はわかりません。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再帰関数呼び出しが原因です」というメッセージは発生しません。Microsoft が述べている Agian は、Microsoft の製品が具体的にスローする固有のエラーです。

アップデート

.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@は、アセンブリがこれらの文字列を参照するために使用する何らかの参照であると想定しています。これらの文字列を使用するアセンブリの 1 つにこれらを結び付ける方法に関する情報はありますか? @これまでのところ、シンボルとフォーマットが一致するデータは IL ダンプにないようです。

4

3 に答える 3

2

例外の原因については、ワイヤーの反対側を調べる必要がある可能性が非常に高いです。Soap を使用していることを忘れないでください。SoapMessage.Exception プロパティは、null でない場合に SoapHttpClientProtocol.ReadResponse() 内でスローされます。

例外テキストは、いわゆるソフト スタック オーバーフローを示唆しています。Windows 例外コード 0xe053534f (よくググる) は、ハード スタック オーバーフローを引き起こさずに関数を実行するのに十分なスタック領域が残っていないことを相互運用コードが検出したときにスローされます。

于 2010-12-22T18:54:10.337 に答える
0

当面は、IIS ワーカー w3wp.exe のスタック サイズを単純に増やすことができます (editbin を使用)。デフォルトのスタックサイズはとてつもなく小さいです。

于 2010-12-22T16:31:55.670 に答える
0

これは StackOverflowException です。SOAP 呼び出しでサーバー側のスタック トレースが欠落しているというのは、致命的な問題です。

于 2010-12-22T20:23:33.807 に答える