AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Threadname nach FastMM4-Meldung rauskriegen
Thema durchsuchen
Ansicht
Themen-Optionen

Threadname nach FastMM4-Meldung rauskriegen

Ein Thema von Mattze · begonnen am 25. Mai 2016 · letzter Beitrag vom 26. Mai 2016
Antwort Antwort
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#1

Threadname nach FastMM4-Meldung rauskriegen

  Alt 25. Mai 2016, 06:54
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#2

AW: Threadname nach FastMM4-Meldung rauskriegen

  Alt 25. Mai 2016, 10:29
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#3

AW: Threadname nach FastMM4-Meldung rauskriegen

  Alt 25. Mai 2016, 13:37
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
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Threadname nach FastMM4-Meldung rauskriegen

  Alt 26. Mai 2016, 17:03
Kannst natürlich auch die von himi zitierte Funktion einfach rauskopieren und als eigene Funktion mit auskommentierter if-Bedingung irgendwo einfügen und verwenden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#5

AW: Threadname nach FastMM4-Meldung rauskriegen

  Alt 26. Mai 2016, 17:21
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 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