2016-03-15 6 views
6

Ich versuche, einen Inhalt des Standards TaskScheduler in einem Dump von .NET application zu finden. Wie kann ich das machen?Wie finde ich einen Inhalt des Standard-TaskScheduler in einem Dump einer .NET-Anwendung?

Eine Anwendung wurde aufgehängt.

application was hung

Ich muss sicherstellen, dass die Standard-Scheduler einen delayed task mit einem gewissen delegate enthält.

+2

@LievenKeersmaekers: Ich glaube, er spricht über die [Taskscheduler] (https://msdn.microsoft.com/en-US/library/system.threading.tasks.taskscheduler%28v=vs.110%29 .aspx) Klasse –

+0

Ja, ich spreche von der TaskScheduler-Klasse. Speziell über die [TaskScheduler.Default-Eigenschaft] (https://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.default (v = vs.110) .aspx) –

+0

Ist es eine regelmäßige '.dmp'? Versuchen Sie es in Visual Studio zu öffnen. Bei ausreichend vielen Symbolen sollte der Debugger eine Übersicht über Tasks (Debug -> Windows -> Tasks) anzeigen können. Wenn es sich um einen partiellen Dump handelt oder Sie keine Symbole haben, funktioniert das nicht, aber es ist einen Versuch wert. –

Antwort

1

Zuerst finden die Methodentabelle der Taskscheduler

0:025> .loadby sos clr 
0:025> .symfix c:\debug\symbols 
0:025> !name2ee mscorlib.dll System.Threading.Tasks.TaskScheduler 
Module:  000007feeea11000 
Assembly: mscorlib.dll 
Token:  000000000200052e 
MethodTable: 000007feef0a8ab0 
EEClass:  000007feeebde1a8 
Name:  System.Threading.Tasks.TaskScheduler 

Dann werfen den Haufen einige Objekte dieser Art zu finden. Beachten Sie, dass ich String hier verwende, da ich keine Anwendung mit einem TaskScheduler zur Verfügung habe.

0:025> !dumpheap -mt <MethodTable> 

Jetzt, da Sie einige Objekte haben, löschen Sie einfach einen von ihnen.

0:025> !do 00000000126ed548 
Name:  System.String 
MethodTable: 000007feef0bda88 
EEClass:  000007feeea16a08 
Size:  34(0x22) bytes 
File:  C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll 
String:  100% 
Fields: 
       MT Field Offset     Type VT  Attr   Value Name 
000007feef0c03d0 4000243  8   System.Int32 1 instance    4 m_stringLength 
000007feef0bec38 4000244  c   System.Char 1 instance    31 m_firstChar 
000007feef0bda88 4000248  80  System.String 0 shared   static Empty 

Beachten Sie die shared (statisch) Eigenschaft Empty für den String. Sie sollten etwas ähnliches in TaskScheduler für die statische Eigenschaft Default erhalten.

Wie Sie sehen können, können Sie nichts sehen. Deshalb brauchen Sie die SOSEX Erweiterung und tun Sie eine !mdt System.Threading.Tasks.TaskScheduler.

0:025> !mdt System.String 
System.String 
[...] 
    [s]Empty: string 
     AppDomain 'Test.exe' (0000000001d73470): 0000000011fc1420[System.String] STRVAL= 
+1

Diese Antwort wird wahrscheinlich keine für die Frage relevanten Ergebnisse liefern. Die von 'TaskScheduler.Default' geplanten Tasks werden in den meisten Implementierungen in keiner Instanz der Klasse gefunden (speziell nicht in' ThreadPoolTaskScheduler'). Eine tatsächliche Antwort ist viel mehr beteiligt. –

+0

@JeroenMostert: wie in den Kommentaren erwähnt, das ist was er wollte. Wenn es das Problem nicht löst, ist das eine andere Geschichte. Wenn Sie eine bessere Antwort wissen, würde ich mich freuen, davon zu hören. Fühlen Sie sich frei, zu downvote. –

Verwandte Themen