概要:
- 一連のメモリ ダンプは、32 ビット プロセス内のメモリ リークの原因を発見する目的で収集されます。
- Debug Diagnostics を使用してダンプを分析しようとすると、2 時間後に失敗し、タイムアウト例外が報告されます。
- 4 時間のタイムアウトを指定する DebugDiag.Analysis.exe.config で「AnalysisCompletedTimeout」パラメータを指定すると、タイムアウト例外が報告されないようにすることに成功します。代わりに、2 時間後に、完全に空のレポートが生成されます。
タイムアウトの問題を回避しようとする私の試みは、部分的にしか成功していないようです。私の質問は、分析を成功させて分析レポートを生成する方法について提案を求めることです。
詳細:
顧客からの要求に応じて、32 ビット COM+ サーバー アプリケーションの一連のメモリ ダンプが提供されました。アイデアは、LeakTrack dll を使用して、このプロセスで観察されたメモリ リークの原因を突き止めることです。
デバッグ診断分析ツールが開始され、ダンプ ファイルが追加されます。「MemoryAnalysis」チェックボックスをチェックすると、分析が開始されます。2 時間後、分析ツールに問題を報告するメッセージ ボックスが表示されます。
No report file was generated
---------------------------
An error occurred while generating the analysis report
Exception:
Type: TimeoutException
Message: This request operation sent to net.pipe://localhost/15466de6-db7d-477f-aac4-42980eb2f27f did not receive a reply within the configured timeout (02:00:00). The time allotted to this operation may have been a portion of a longer timeout. This may be because the service is still processing the operation or because the service was unable to send a reply message. Please consider increasing the operation timeout (by casting the channel/proxy to IContextChannel and setting the OperationTimeout property) and ensure that the service is able to connect to the client.
StackTrace:
Server stack trace:
at System.ServiceModel.Dispatcher.DuplexChannelBinder.SyncDuplexRequest.WaitForReply(TimeSpan timeout)
at System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at DebugDiag.DotNet.x86Analysis.IAnalysisService.RunAnalysisRules(List`1 analysisRuleInfos, List`1 dumpFiles, String symbolPath, String imagePath, String reportFileFullPath, TimeSpan timeout, Boolean twoTabs, Boolean includeSourceAndLineInformationInAnalysisReports, Boolean setContextOnCrashDumps, Boolean doHangAnalysisOnCrashDumps, Boolean includeHttpHeadersInClientConns, Boolean groupIdenticalStacks, Boolean includeInstructionPointerInAnalysisReports, List`1& facts)
at DebugDiag.DotNet.NetAnalyzer.RunX86Analysis(NetProgress progress, List`1 dumpFiles, List`1 analysisRuleInfos, String symbolPath, String imagePath, String reportFileFullPath, Boolean twoTabs, NetResults& results, List`1& facts)
at DebugDiag.DotNet.NetAnalyzer.RunAnalysisRulesInternal(DumpFileType bitness, NetProgress progress, String symbolPath, String imagePath, String reportFileFullPath, Boolean twoTabs, AnalysisModes analysisMode)
at DebugDiag.DotNet.NetAnalyzer.RunAnalysisRules(NetProgress progress, String symbolPath, String imagePath, String reportFileDirectoryOrFullPath, Boolean twoTabs, AnalysisModes analysisMode)
at DebugDiag.Analysis.AnalyzerClient.RunAnalysisAsyncInternal(NetProgress progress, String symbolPath, String imagePath, List`1 dumpFiles, List`1 analysisRules, String reportFileDirectoryOrFullPath, Boolean IncludeSourceAndLineInformationInAnalysisReports, Boolean SetContextOnCrashDumps, Boolean DoHangAnalysisOnCrashDumps, Boolean IncludeHttpHeadersInClientConns, SynchronizationContext synchContext, Boolean ExcludeIdenticalStacks, Boolean IncludeInstructionPointerInAnalysisReports)
JetBrains dotPeek を使用して DebugDiag 分析ツール アセンブリを調べた後、DebugDiag.Analysis.exe.config を変更して、タイムアウト設定を 4 時間に変更してみました。
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="DebugDiag.DotNet.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<DebugDiag.DotNet.Properties.Settings>
<setting name="AnalysisCompletedTimeout" serializeAs="String">
<value>04:00:00</value>
</setting>
</DebugDiag.DotNet.Properties.Settings>
</applicationSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
<system.net>
<defaultProxy useDefaultCredentials="true">
</defaultProxy>
</system.net>
</configuration>
分析を再試行すると、ツールは再び約 2 時間機能します。完了すると、Internet Explorer が起動され、そのレポートが完全に空白であることが判明します。DebugDiag レポート フォルダーを確認すると、.mht レポート ファイルのサイズが 0 バイトであることがわかります。ただし、今回は「タイムアウト例外」メッセージ ボックスは表示されませんでした。
私が持っている質問は次のとおりです。レポートが生成されないのはなぜですか? デバッグ diag 分析ホスト プロセスまたは呼び出し (UI) プロセスのいずれかで、レポートを完了するために追加または修正する必要がある追加の構成設定はありますか?
他に何が問題なのかを確認するために、分析が開始されたら、windbg をプロセス DebugDiag.x86AnalysisHost.exe にアタッチしました。私の希望は、何が起こっているのかの手がかりを提供できる他の例外条件の証拠を見ることができるかもしれないということでした. ただし、プロセスは制御された方法で終了するように見え、例外条件はありません。
次に行く場所の提案を歓迎します。