2009-11-17 5 views
7

In regelmäßigen Abständen kommt es zu einem Ausfall eines Windows-Dienstes in einer Produktionsumgebung, den wir einfach nicht reproduzieren können. Es kann Monate dauern, bis es wieder passiert.Von ProcessThread zu einem verwalteten Thread gelangen

Ich gebe einige Diagnosen ein, um zu versuchen, mit dem Problem zu helfen, eine Sache, die ich ansehe, ist das Hinzufügen eines Ereignisses zum System-Thread-Pool für 60 Sekunden, nachdem wir das Herunterfahren der Anwendung initiiert haben. Unsere Anwendung sollte innerhalb von maximal 10 Sekunden sauber heruntergefahren werden.

In diesem Fall möchte ich die verbleibenden laufenden Threads des Prozesses auf das Ereignisprotokoll verfolgen.

Ich kann die laufenden Threads mit System.Diagnostics.Process.GetCurrentProcess.Threads erhalten. Diese Threadobjekte haben native Win32-Thread-IDs usw.

Ich habe mich gefragt, ob es eine Möglichkeit gibt, von diesen Thread-IDs zu allen verwalteten Threads zurückzukehren, die sie im aktuellen Prozess darstellen. Der Grund, warum ich das versuche, ist, weil wir für unsere Thread-Pools und andere Threads, die wir spawnen, die Namen geben, die ihren Zweck repräsentieren, und es würde wirklich helfen, diese zurückzubekommen.

+0

Hat jemand schon einmal, wie dies zu tun herausgefunden, 3 Jahre später? –

+0

Hallo Bruno, das ist grundsätzlich nicht möglich. – Bigtoe

+1

Wie haben Sie den Threads im Thread-Pool Namen zugewiesen? IMHO das ist nicht möglich. –

Antwort

11

Dies ist aus dem folgenden Grund nicht möglich. Quote from MSDN:

Ein Betriebssystem ThreadID Gewinde keine feste Beziehung zu einem verwalteten hat, weil eine nicht verwaltete Host die Beziehung zwischen verwalteten und nicht verwalteten Threads steuern. Insbesondere kann eine hoch entwickelte Host verwenden, um die CLR-Hosting-API viele verwaltete Threads gegen denselben Betriebssystem-Thread oder zu bewegen, um einen Faden zwischen verwaltet verschiedene Betriebssystem Threads einzuplanen.

Es gibt also keine Eins-zu-Eins-Zuordnung zwischen verwalteten Threads und OS-Threads.

Jetzt wird die Frage, wie Sie eine Liste aller verwalteten Threads erhalten, die derzeit im aktuellen Prozess ausgeführt werden? Leider kenne ich die Antwort nicht.

+0

Danke Darin. Ich hatte diese Schlussfolgerung selbst aus dem Lesen im Web gezogen. Ich hatte gehofft, dass jemand da draußen vielleicht ein bisschen Magie gewusst hätte, um auf dieses Problem zu werfen, das den Trick hätte bringen können.Ich zeichne derzeit alle nicht verwalteten Thread-Informationen auf, die ich in die Finger bekommen kann. Wird versuchen, ähnliche Informationen für alle verwalteten Threads zum Zeitpunkt der Erstellung anzugeben, an denen ich auf diese Funktionen zugreifen kann. Hoffentlich bekomme ich eine Korrelation zwischen ihnen. – Bigtoe

+1

"Wie bekomme ich eine Liste aller verwalteten Threads, die derzeit im aktuellen Prozess ausgeführt werden" - möglich mit einem Debugger, z. WinDbg + SOS ('! Threads') –

+0

[ein ähnliches Problem und eine Antwort, die zeigt, wie verwaltete Threads aufgelistet und ihre Stacktraces durchsucht werden] (http://stackoverflow.com/a/35558240/717732) – quetzalcoatl

0

Es sieht nicht so aus, als ob das möglich ist.
Glücklicherweise haben wir unsere eigenen Threading-Bibliotheken, die die .NET-Bibliotheken umhüllen, und ich konnte Funktionen einfügen, um eine Liste aktiver Threads zu behalten, die wir für diese Diagnose verwenden können.
Das funktioniert ganz gut, aber es gab natürlich eine Menge Aufwand und Tests, aber wir hoffen, dass wir die Talsohle erreichen.