AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Handle Count erhöht sich

Ein Thema von venice2 · begonnen am 28. Jul 2020 · letzter Beitrag vom 29. Jul 2020
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Handle Count erhöht sich

  Alt 28. Jul 2020, 16:09
Es gibt verschiedene "Handles", drum hat der Taskmanager auch mehrere Spalten dafür, z.B.
* Handles (z.B. Dateien und Dergleichen)
* GDI-Objects (die aus'm GDI)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#2

AW: Handle Count erhöht sich

  Alt 28. Jul 2020, 16:10
Es gibt verschiedene "Handles", drum hat der Taskmanager auch mehrere Spalten dafür, z.B.
* Handles (z.B. Dateien und Dergleichen)
* GDI-Objects (die aus'm GDI)
Dessen bin ich mir bewusst und das ist der grund warum es so schwer ist das Problem zu lokalisieren.
Welche Schritte ich verfolge habe ich ja schon geschrieben.

Nochmal.
DLL entladen. true
GDI_Handles keine Auffälligkeiten.
Dateien werden freigegeben siehe DLL entladen.
Threads ein und ausschalten versucht. Keine Änderung beim Counter.
Das Handle das über BeginThread erstellt wird, wird ebenfalls geschlossen.

CloseHandle(Handle);


Danke.

Geändert von venice2 (28. Jul 2020 um 16:19 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.554 Beiträge
 
Delphi 7 Professional
 
#3

AW: Handle Count erhöht sich

  Alt 28. Jul 2020, 16:38
Wieviele Handles hat Dein Programm vor dem Laden der DLL?

Wieviele Handles benötigst Du beim Laden der DLL? (vermutlich 1)

Wieviele Handles hat das Programm, wenn die DLL geladen ist? (vermutlich 1, wenn mehr, benötigt die DLL selber auch noch welche)

Wieviele Handles hat Dein Programm nach der Freigabe der DLL?

Theoretisch Handles des Programmes + 1 beim Laden der DLL - 1 durch die Freigabe der DLL.

Sollte also zu einem Nullsummenspiel werden: Handles vorher = Handles nachher.

Wenn aber bei geladener DLL mehr als 1 Handle hinzukommt, aber beim Freigeben der DLL nur 1 Handle entfernt wird, liegt der Fehler (höchstwahrscheinlich) in der DLL.

Hab' keine Ahnung, wie man das sicher und verlässlich überprüfen kann.

Im Zweifelsfalle im Debugger an alle möglichen Stellen 'nen Breakpoint setzen und dort dann jeweils nachschauen, wie es so bei den Handles aussieht.

DLL entladen. true: Das heißt aber nicht, dass die DLL selbst "vernünftig" aufgeräumt hat, sondern nur, dass Dein Programm die DLL "vernünftig" entladen hat. Das schließt halt nicht aus, dass hier trotzdem noch Handles übrigbleiben.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Handle Count erhöht sich

  Alt 28. Jul 2020, 17:20
https://docs.microsoft.com/en-us/sys...wnloads/handle
oder den Process Explorer

Ich hatte auch mal vor Jahren ein Handle-Leck
und hab mir am Ende ganz böse einen extrem ineffektiven Code gebastelt, der alle eine Milliarde möglichen Handles durchprobiert, die "Gültigen" gezählt und dann vor/nach verdächtigen Funktionsaufrufen die Differenz gebildet.

HANDLE = LongWord (Integer), aber die Handles sind "immer" an Integergrenzen ausgerichtet (weil ist "aktuell" zufällig direkt der Index zur HandleListe des Systems), deswegen ging es am Ende 3/4 schneller.


Das Ergebnis könnte man sich auch in einer Liste oder Bitmaske speichern und für den Vergleich nutzen.
Und teilweise ist es dann auch möglich zum Handle auch einen Namen zu bekommen.
z.B. MSDN-Library durchsuchenGetFinalPathNameByHandle, MSDN-Library durchsuchenGetModuleFileName usw.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#5

AW: Handle Count erhöht sich

  Alt 28. Jul 2020, 17:20
Zitat:
Theoretisch Handles des Programmes + 1 beim Laden der DLL - 1 durch die Freigabe der DLL.
Der Handle Count ändern sich nicht nach der Freigabe.
Und wird dann beim nächsten start einer anderen DLL inkrementiert.

Zitat:
oder den Process Explorer
Den verwende ich.

Warum bekomme ich mit LoadLibrary(xxx.dll) immer das gleiche Handle?

Geändert von venice2 (28. Jul 2020 um 17:29 Uhr)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
771 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Handle Count erhöht sich

  Alt 28. Jul 2020, 17:54
Warum bekomme ich mit LoadLibrary(xxx.dll) immer das gleiche Handle?
Bei früheren Windows Versionen landeten DLLs nach dem Entladen noch einige Zeit im Cache. Ich weiss nicht, ob dem bei bei aktuellen Wins noch so ist. Es könnte ja sein... und dann wäre das gleiche Handle irgendwie "logisch".

(Bei früheren Win Versionen konntest du via [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr entVersion\Explorer] AlwaysUnloadDLL=1 erzwingen, dass die DLL nach dem Entladen nicht noch im Cache landete.)

Es gibt sicher Leute hier, welche ganz genau wissen, wie das heute so läuft...
Michael Gasser
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#7

AW: Handle Count erhöht sich

  Alt 28. Jul 2020, 17:58
Zitat:
Es könnte ja sein... und dann wäre das gleiche Handle irgendwie "logisch".
Ja solange es sich immer um die gleiche DLL handelt ist das ja auch kein problem.

Aber ich lade unterschiedliche DLLs also sollte eigentlich das Handle auch unterschiedlich sein.
Abhängig von der jeweiligen DLL egal ob sich diese im Cache befindet oder nicht.

Also wenn die Handles immer gleich sind welche DLL wird denn dann nun entladen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Handle Count erhöht sich

  Alt 28. Jul 2020, 18:34
Das "Handle" einer DLL entspricht aktuell "zufällig" der Adresse im RAM (bei Win32 ... 64 weiß ich nicht)
und so lange die DLL immer an der selben Stelle geladen wird, bleibt sie auch dort.

Außerdem, wenn die DLL beim FreeLibrary nicht freigegeben wird, weil z.B. noch ein anderes Handle drauf zeigt (Referenzzählung), dann lädt das nächste LoadLibrary auch nicht neu und bekommt das aktive Handle.

Statt MSDN-Library durchsuchenLoadLibrary vorher einfach mal mit MSDN-Library durchsuchenGetModulHandle nachsehn, ob die schon/noch da ist.

Jede EXE/DLL hat zwar eine LadeAdresse und würde "eigentlich" auch immer an der Stelle geladen, also hätte somit immer die selbe Adresse/Handle bekommen, ABER
* fast Alle Entwickler vergessen die zu setzen, somit steht die Vorgabe immer auf $00400000, was oft belegt ist (wenn mehrere EXE/DLL die Gleiche haben) und somit verschoben wird
** allerdings hat Windows einen Cache und merkt es sich ... um nicht jedesmal neu die Reallocations neu zu berechnen
** dieser Cache sorgt auch dafür, dass mehrere Instanzen der DLL in verschiedenen Programmen bzw. Programminstanzen (Programm mehrmals gestartet) auch "möglichst" die selbe Adresse haben (gemeinsam genutzter Speicher)
http://docwiki.embarcadero.com/RADSt...e-Basisadresse
* und man kann im Windows auch eine Sicherheitfunktion aktivieren, womit EXE und DLLs immer neu zufällig positioniert werden, damit Hacker/Viren/Trojaner mit statischen Zeigern kein "leichtes" Spiel haben, z.B. durch einen billigen Bufferoverflow im Browser

Zitat:
aber ich lade unterschiedliche DLLs also sollte eigentlich das Handle auch unterschiedlich sein.
so lange die Entwickler keinen Mist gebaut haben ... z.B. überall die gleiche ImageBase
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Jul 2020 um 18:38 Uhr)
  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 00:08 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 by Thomas Breitkreuz