![]() |
Threadname nach FastMM4-Meldung rauskriegen
Hallo,
FastMM4 sagt am Programmende: "FastMM hat einen Versuch festgestellt, eine virtuelle Methode eines freigegebenen Objekts aufzurufen. Es wird jetzt eine Zugriffsverletzung erzeugt, um den aktuellen Betrieb abzubrechen. Freigegebene Objektklasse: TTimer Virtuelle Methode: Destroy Virtuelle Methodenadresse: 44A71C The allocation number was: 12173 The object was allocated by thread 0xC2C, and the stack trace (return addresses) at the time was:..." Was da passiert, ist klar. Nur, wie kriege ich jetzt den Klarnamen des Threads? Mit dem Processexplorer habe ich bisher nur die Startadresse des Threads (Programm+Adresse) rausgefunden. Das ganze unter Win7-64 mit D7 pro. Ich hoffe, das geht. Gruß Mattze |
AW: Threadname nach FastMM4-Meldung rauskriegen
Im Log des Debuggers suchen und sonst garnicht, weil Borland/Codegear/Embarcadero das einfach zu blöd implementiert haben, denn ...
Delphi-Quellcode:
Also erstmal müsstest DU nach Start der Threads und einmal im Hauptthread das TThread.NameThreadForDebugging aufrufen und dann ist diese Funktion total nutzlos, wenn das Programm nicht im Debugger läuft.
class procedure TThread.NameThreadForDebugging(AThreadName: AnsiString; AThreadID: TThreadID); // ist auch nicht virtuell
type TThreadNameInfo = record FType: LongWord; // must be 0x1000 FName: PAnsiChar; // pointer to name (in user address space) FThreadID: LongWord; // thread ID (-1 indicates caller thread) FFlags: LongWord; // reserved for future use, must be zero end; var ThreadNameInfo: TThreadNameInfo; begin if IsDebuggerPresent then // ########################### toll, niwa? begin ThreadNameInfo.FType := $1000; ThreadNameInfo.FName := PAnsiChar(AThreadName); ThreadNameInfo.FThreadID := AThreadID; ThreadNameInfo.FFlags := 0; try RaiseException($406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo); except end; end; end; Alternativ diese Funktion böse hooken und die Threads selber in einer Liste speichern oder TThread.Execute, bzw. Classes.ThreadProc oder Windows.BeginThread hooken und die ThreadIDs in einer Liste speichern oder direkt in deine Threads am Anfang einen Code rein, der das in einer eigenen Liste speichert. |
AW: Threadname nach FastMM4-Meldung rauskriegen
Hallo himitsu,
vielen Dank für die Antwort. Sowas habe ich schon vermutet. Also doch "stochern im Dunkeln" oder die berühmte Nadel im Heuhaufen. Da mich da keiner drängelt, habe ich ja Zeit zum Suchen... :( Gruß Mattze |
AW: Threadname nach FastMM4-Meldung rauskriegen
Kannst natürlich auch die von himi zitierte Funktion einfach rauskopieren und als eigene Funktion mit auskommentierter if-Bedingung irgendwo einfügen und verwenden.
|
AW: Threadname nach FastMM4-Meldung rauskriegen
Zitat:
denn sonst müsste man sich ebenfalls in die Exceptionbehandlung einklinken (so wie es auch der Debugger macht) und auf diese Exception lauschen, um dann den Thread in einer Liste abzuspeichern. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz