Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Threadname nach FastMM4-Meldung rauskriegen (https://www.delphipraxis.net/189280-threadname-nach-fastmm4-meldung-rauskriegen.html)

Mattze 25. Mai 2016 05:54

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

himitsu 25. Mai 2016 09:29

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:
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;
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.

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.

Mattze 25. Mai 2016 12:37

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

TiGü 26. Mai 2016 16:03

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.

himitsu 26. Mai 2016 16:21

AW: Threadname nach FastMM4-Meldung rauskriegen
 
Zitat:

Zitat von TiGü (Beitrag 1338998)
Kannst natürlich auch die von himi zitierte Funktion einfach rauskopieren und als eigene Funktion mit auskommentierter if-Bedingung irgendwo einfügen und verwenden.

Dann besser selber eine Liste führen,
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 10:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz