2017-06-01 1 views
4

async/awaitパターンを使用する複雑なASP.Netコアアプリケーションがあります。アプリは最近応答を停止し、メモリダンプを取りました。私たちは、アプリを止めさせる非同期操作がいくつかあるとは思うが、どちらが確実かわからない。 Webアプリケーションのメモリダンプを取った後、async/awaitの使用のためにスレッドがスレッドプールに返されているため、実行スレッドはほとんど見えません。 問題は、実行中のタスクをメモリダンプにリストすることができますか、実行したタスクがどこにあるかによって、どの非同期操作によってアプリケーションが停止するのかを知ることができますか?同期ブロッキング呼び出しでは、すべてのアクティブなスレッドの呼び出しスタックをリストするだけで簡単です。しかし、非同期操作では、それ以上は動作しません。 (トレースを追加することは可能なアプローチですが、アプリケーションやそれに依存するライブラリのすべての非同期操作に十分なトレースがあることは保証できません)。実行中のタスクを.netメモリダンプにリストする方法

たとえば、ASP.Net Coreアプリがこのようなコードで詰まっていますが、どうすればメモリダンプからそれを伝えることができますか?

答えて

4

もちろん、ヒープ内のタスクオブジェクトを見つけて、SOSコマンド(例:デバッグセッションのこの初めのように:

0:013> !dumpheap -stat -type Task 
Statistics: 
     MT Count TotalSize Class Name 
[...] 
71e03f28  4   160 System.Threading.Tasks.Task 
Total 28 objects 

0:013> !dumpheap -mt 71e03f28 
Address  MT  Size 
022bd900 71e03f28  40  
[...] 

0:013> !do 022bd900 
Name:  System.Threading.Tasks.Task 
MethodTable: 71e03f28 
EEClass:  719cd6e0 
Size:  40(0x28) bytes 
File:  C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll 
Fields: 
     MT Field Offset     Type VT  Attr Value Name 
71df1638 40019cd  1c   System.Int32 1 instance  3 m_taskId 
71defb44 40019ce  4  System.Object 0 instance 022bd8e0 m_action 
[...] 

0:013> !DumpObj 022bd8e0 
Name:  System.Action 
MethodTable: 71e0588c 
EEClass:  719357b8 
Size:  32(0x20) bytes 
File:  C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll 
Fields: 
     MT Field Offset     Type VT  Attr Value Name 
71defb44 40002b5  4  System.Object 0 instance 022bd8e0 _target 
71defb44 40002b6  8  System.Object 0 instance 00000000 _methodBase 
71df2bdc 40002b7  c  System.IntPtr 1 instance 4b00e64 _methodPtr 
71df2bdc 40002b8  10  System.IntPtr 1 instance 4e0c30 _methodPtrAux 
[...] 

0:013> !u 4e0c30 
Unmanaged code 
004e0c30 e833df8372  call clr!PrecodeFixupThunk (72d1eb68) 
[...] 

そして今、面倒になり始めています...私の視点から(WinDbgの中)

最も便利な方法は、Mex (Github)!TaskTriageのコマンドを使用して、次のとおりです。

0:013> !TaskTriage 
Normal Mode - not showing successful Tasks 
Address Target  Status      Method        Exceptions 
================================================================================================== 
022bd900 | 022bd8e0 | TASK_STATE_DELEGATE_INVOKED | Demo.Program.printMessage()  |  <none> 
022bd974 | 022bd868 | TASK_STATE_DELEGATE_INVOKED | Demo.Program+<>c.<Main>b__0_0() |  <none> 
022bd9bc | 022bd868 | TASK_STATE_STARTED   | Demo.Program+<>c.<Main>b__0_1() |  <none> 
022bda04 | 022bd868 | TASK_STATE_STARTED   | Demo.Program+<>c.<Main>b__0_2() |  <none> 
================================================================================================== 
Address Target  Status      Method        Exceptions 

VS2015とVS2017の両方がダンプ・ファイルから同じ結果を与えることができなくなりますので、Visual Studioの上のWinDbgを使用してのアイデアは、良いです:

Result in VS2015 and VS2017

関連する問題