Ist es möglich, den Thread-Exit mit einem spezifischen Fehlercode zu unterbrechen?

8

Ich habe mich gefragt, ob es möglich ist, Visual Studio 2008-Debugger so zu konfigurieren, dass die Ausführung gestoppt wird, wenn ein Thread mit einem genauen Fehlercode (oder mindestens einem Wert ungleich Null) beendet wird. Meine App verwendet eine enorme Anzahl von Threads, sodass es nicht möglich ist, sie alle manuell zu verfolgen.

Gibt es eine Möglichkeit, VS2008 zu brechen, wenn ein beliebiger Thread im Programm auf "exit (X)" klickt? (X ist anders als 0) und Quelle anzeigen?

    
GaTTaCa 31.10.2012, 17:44
quelle

1 Antwort

3

Ja, setze einen Haltepunkt in der Funktion _RtlExitUserThread@4 und füge eine Bedingung von *(int*)(ESP+4) == 42 hinzu, um zu testen, ob der Exit-Status ein bestimmter Wert ist (42, in diesem Beispiel); Verwenden Sie für 64-Bit-Programme ESP+8 anstelle von ESP+4 .

Wenn der Thread jedoch beendet wird, indem er von seiner Hauptthread-Prozedur (der übliche Fall) zurückkehrt, anstatt ExitThread oder einen seiner Wrapper direkt aufzurufen, haben Sie keine Informationen darüber, welcher Thread er war oder was verursacht wurde Es wird anders als der Exit-Status und die Thread-ID beendet.

Hinweis: Der Funktionsname _RtlExitUserThread@4 ist ein Implementierungsdetail, das sich in zukünftigen Windows-Versionen ändern kann. _RtlExitUserThread@4 ist der Name unter Windows 7. Um herauszufinden, was sich auf Ihrem System tatsächlich befindet, führen Sie dumpbin /exports C:\Windows\system32\kernel32.dll aus und suchen Sie nach dem Namen, auf den ExitThread verweist.

    
Adam Rosenfield 31.10.2012, 18:26
quelle