c # - Indhentning af stakkespor info fra alle pause i øjeblikket midlertidigt (administreret)

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en Windows C # Application (WPF) - den er ret stor og en masse multithreading foregår.


Mit problem er, at jeg kender til flere deadlocks, der findes i ansøgningen her og der først - og for det andet - jeg er bange for at frigive den uden en måde at registrere potentielle nye og uden at kunne rapporteres tilbage til os på en eller anden måde.


Applikationen har en ledsager - en lille eksekverbar (wpf c # igen) kaldet Launcher - den bruges til at starte den rigtige proces fra sig selv.


Hvorfor? Fordi jeg omdirigerer alle fejl og ydre output, når hovedapplikationen går ned - til Launcheren.


Til gengæld - når et crash er opdaget - lancerer launcheren en anden eksekverbar - BugReports - sender fejloplysningerne til den.


Senere indsender BugReports denne information, og nogle bruger har skrevet kommentarer til en webservice.


Opsætningen er som denne:


Launcher - bruges til at starte hovedapplikationen og opdage, hvornår den går ud
MainApp - startet af Launcher
BugReports - lanceret af Launcher - når et nedbrud er blevet detekteret. Crash-oplysninger opnået ved Launcher sendes ved kommandolinjen til BugReports. Den sender informationen til en webservice.


Forvirrende jeg ved :)


Dette virker perfekt til uhåndterede undtagelser butt .....


I den sidste version af Launcher besluttede jeg at integrere en WatchDog-timer. Det skal overvåge MainApp hvert 30. sekund og opdage, om det er i en låst situation (f.eks. Dødlås).


Hvis det opdager det - det vil dræbe det og starte BugReports igen.


Fungerer perfekt - hver gang MainApp går i stå - det registreres og alle nødvendige processer virker som de skal.


PROBLEMET:


Jeg har brug for at få et 'snapshot' på en eller anden måde af trådstanden i MainApp - hvor de er hos (modul, metode), hvilken tilstand de er i og hvad mere nyttigt information jeg kan få, så vi kan finde ud af, hvor den potentielle dødlås er opstået .


Nu har jeg set op halvdelen af ​​internettet, og jeg er ikke i stand til at finde ud af sådan jeg ting som jeg vil have det.


Dybest set - ideen er at få et fugleperspektiv - som om jeg pause MainApp i den visuelle studio debugger og kunne tjekke hvor hver tråd er på og hvad problemet er.


Er dette muligt?


Eventuelle retningslinjer for, hvad skal jeg grave til mere?


Tak,
Martin K.

Bedste reference


Det er muligt, men ikke let! Hvis du skriver af dig selv, skal du begynde noget rigtig sjovt, men tidskrævende.
Når jeg var nødt til at gøre det samme (mere eller mindre), og jeg brugte MSE (Managed Stack Explorer). Det er hostet på CodePlex, og du kan bruge sit kernebibliotek uden nogen brugergrænseflade (for perfekt integration i dit værktøj). [1]

Andre referencer 1


Overvej minidumps i stedet for stakke (bemærk privatliv bekymringer).


Tjek dette for Fejlrapportering Hvad er den bedste måde at indsamle crash data på? Herunder information om Windows Fejlrapportering og denne tråd - Genskab stakspor med linjenumre fra brugerfejlrapport i .net?. [[[3]


Du kan også oprette minidump selv med MiniDumpWriteDump. [5]


BEMÆRK: Procesdump indeholder brugerens personlige oplysninger. Du skal sørge for at forstå problemer og regler i forbindelse med kopiering af brugerens personlige oplysninger til dine maskiner. Beskyttelse af personlige oplysninger gælder også for anden crash/hænge rapportering.

Andre referencer 2


Debugger -> Windows -> Parallelstabler


Jeg synes, det er nyt for VS2012 nyere version og findes i VS2013, jeg er ikke sikker. Jeg har faktisk lige fundet dette her til morgen ...


http://msdn.microsoft.com/en-us/library/dd998398.aspx[6]


Jeg håber det hjælper nogen, der snuble over denne tråd! Virkelig cool funktion!