Ich bin auf der Suche nach einer Möglichkeit, eine seltene Delphi 7 kritischen Abschnitt (TCriticalSection) Hang/Deadlock zu debuggen. Wenn in diesem Fall ein Thread länger als etwa 10 Sekunden auf einen kritischen Abschnitt wartet, würde ich gerne einen Bericht mit dem Stack-Trace von sowohl dem Thread, der gerade den kritischen Abschnitt sperrt, als auch dem Thread, der nicht in der Lage war, erstellen um den kritischen Abschnitt nach einer Wartezeit von 10 Sekunden zu sperren. Es ist OK, wenn eine Ausnahme ausgelöst wird oder die Anwendung beendet wird.Delphi: Debuggen kritischer Abschnitt durch Berichtsaufruf von laufenden Threads auf Sperre "Fehler" hängen
Ich würde es vorziehen, weiterhin kritische Abschnitte zu verwenden, anstatt andere Synchronisationsprimitive zu verwenden, wenn möglich, aber wenn nötig, um eine Zeitüberschreitungsfunktion zu erhalten.
Wenn das Tool/die Methode zur Laufzeit außerhalb der IDE funktioniert, ist das ein Bonus, da dies bei Bedarf nur schwer reproduziert werden kann. In dem seltenen Fall, dass ich den Deadlock in der IDE duplizieren kann, wenn ich versuche, Pause zu starten, um das Debuggen zu starten, sitzt die IDE einfach da und tut nichts, und kommt niemals in einen Zustand, in dem ich Threads oder Call Stacks sehen kann. Ich kann das laufende Programm jedoch zurücksetzen.
Update: In diesem Fall habe ich nur mit einem kritischen Abschnitt und 2 Threads zu tun, also ist dies wahrscheinlich kein Lock-Order-Problem. Ich glaube, es gibt einen falsch verschachtelten Versuch, die Sperre über zwei verschiedene Threads einzugeben, was zu einem Deadlock führt.
+1 für den MadExcept-Thread eingefroren überprüfen. –
madExcept kann auch jederzeit aufgefordert werden, einen Thread Dump zu nehmen, also ist das vielleicht ideal dafür. – mj2008
madExcept sieht wie die beste Option aus. Vielen Dank! – Anagoge