AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Der aktuelle Prozess verwendet alle Handles EOSError
Thema durchsuchen
Ansicht
Themen-Optionen

Der aktuelle Prozess verwendet alle Handles EOSError

Ein Thema von JYPDWhite · begonnen am 11. Aug 2014 · letzter Beitrag vom 13. Aug 2014
Antwort Antwort
JYPDWhite

Registriert seit: 29. Sep 2010
28 Beiträge
 
#1

Der aktuelle Prozess verwendet alle Handles EOSError

  Alt 11. Aug 2014, 17:58
Delphi-Version: XE2
Hi ihr,

ich suche seit knapp 3 Tagen einen Fehler bei uns in einem Programm. Er äußert sich darin dass das umschalten von TabSheets nicht mehr funktioniert und ich von Delphi die Exception bekomme:
Zitat:
... Exception der Klasse EOSError mit der Meldung 'Systemfehler. Code: 1158.
Der aktuelle Prozess verwendet alle Handles der zulässigen Höchstanzahl für Window Managerobjekte' aufgetreten.
Der Stacktrace sieht zu dem Zeitpunkt so aus:
Zitat:
:758cc42d KERNELBASE.RaiseException + 0x58
System.SysUtils.RaiseLastOSError(???)
System.SysUtils.RaiseLastOSError
Vcl.Controls.TWinControl.CreateWnd
Vcl.StdCtrls.TCustomCheckBox.CreateWnd
Vcl.Controls.TWinControl.CreateHandle
Vcl.Controls.TWinControl.UpdateShowing
Vcl.Controls.TWinControl.UpdateShowing
Vcl.Controls.TWinControl.UpdateShowing
Vcl.Controls.TWinControl.UpdateShowing
Vcl.Controls.TWinControl.UpdateShowing
Vcl.Controls.TWinControl.UpdateControlState
Vcl.Controls.TWinControl.CMVisibleChanged(???)
Vcl.Controls.TControl.WndProc((45067, 1, 0, 0, 1, 0, (), 0, 0, (), 0, 0, ()))
Vcl.Controls.TWinControl.WndProc((45067, 1, 0, 0, 1, 0, (), 0, 0, (), 0, 0, ()))
Vcl.Controls.TControl.Perform(???,???,0)
Vcl.Controls.TControl.SetVisible(True)
Vcl.ComCtrls.TPageControl.ChangeActivePage($18F044 )
Vcl.ComCtrls.TPageControl.SetActivePage($FFAA3900)
Vcl.ComCtrls.TPageControl.UpdateActivePage
Vcl.ComCtrls.TPageControl.Change
Vcl.ComCtrls.TCustomTabControl.CNNotify(???)
Vcl.Controls.TControl.WndProc((48206, 149608, 1636636, 0, 18536, 2, (), 63772, 24, (), 0, 0, ()))
Vcl.Controls.TWinControl.WndProc((48206, 149608, 1636636, 0, 18536, 2, (), 63772, 24, (), 0, 0, ()))
Vcl.Controls.TControl.Perform(???,???,1636636)
Vcl.Controls.DoControlMsg(???,(kein Wert))
Vcl.Controls.TWinControl.WMNotify((78, (), 149608, $18F91C, 0))
Vcl.Controls.TControl.WndProc((78, 149608, 1636636, 0, 18536, 2, (), 63772, 24, (), 0, 0, ()))
Vcl.Controls.TWinControl.WndProc((78, 149608, 1636636, 0, 18536, 2, (), 63772, 24, (), 0, 0, ()))
Vcl.Controls.TWinControl.MainWndProc(???)
System.Classes.StdWndProc(149628,78,149608,1636636 )
Vcl.Controls.TWinControl.DefaultHandler(???)
:004fbeab TControl.SetVisible + $2B

Und so siehts zu der Zeit im Taskmanager aus:
(Siehe Anhang)




Jemand irgendeine Idee? FastMM4 ist schon scharf gestellt und findet keine Lecks usw. Wobei ich dem seit heute eh nicht mehr traue.


Das ganze passiert nachdem ein Datensatz geladen wird. Das Problem dabei ist dass es ein "organisch" gewachsenes Programm ist ... sprich da ordentlich Code dahinter ist der mal überarbeitet gehört.
Angehängte Grafiken
Dateityp: png taskmanager.png (2,0 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.222 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Der aktuelle Prozess verwendet alle Handles EOSError

  Alt 11. Aug 2014, 18:06
Das werden GDI-Handels, keine "normalen" Datei/...-Handels sein.
Und wenn FastMM nix findet dann sind diese GDI-Handels nicht "verloren" sondern "nur" nicht mehr sichtbar.
D.h. du legst irgendwo ein Element (mit GDI-Handle) an, vergisst es, aber das Formular hält sich das noch als Referenz.
Alternativ wird einfach irgendwo beim Zeichnen vergessen das Handle frei zu geben. So was kann FastMM nicht finden. Evtl. würde man das mit AQTime finden.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
JYPDWhite

Registriert seit: 29. Sep 2010
28 Beiträge
 
#3

AW: Der aktuelle Prozess verwendet alle Handles EOSError

  Alt 11. Aug 2014, 18:11
Kann man irgendwo die Anzahl von GDI-Handles auslesen?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Der aktuelle Prozess verwendet alle Handles EOSError

  Alt 11. Aug 2014, 18:38
Hallo,

viell. hilft das hier?

http://blogs.msdn.com/b/dsui_team/ar...urce-leak.aspx

Und natürlich
http://technet.microsoft.com/de-de/s.../bb896653.aspx
Dort unter Select Columns/ Process Memory/ GID Objects

Heiko
Heiko

Geändert von hoika (11. Aug 2014 um 18:47 Uhr)
  Mit Zitat antworten Zitat
JYPDWhite

Registriert seit: 29. Sep 2010
28 Beiträge
 
#5

AW: Der aktuelle Prozess verwendet alle Handles EOSError

  Alt 11. Aug 2014, 18:47
@hoika
Dank dir für den Link dass man die GDI-Handles im Taskmanager anzeigen kann wusste ich noch nicht

Ok das Programm hat zum Zeitpunkt der Exceptions 1634 GDI-Handles offen. Jedoch hat es wärend der Datensatz geladen wird über 100 mehr. Und laut dem Link sollte ich da auch noch weit von irgendwelchen Grenzen entfernt sein.

Den Rest des Links arbeite ich dann morgen bzw im Laufe der Woche durch. Dank dir erstmla

Edit: Ok also ne GDI-Handlegrenze sollte es nicht sein. BDS.exe hat momentan kanp 4,5k Handles ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Der aktuelle Prozess verwendet alle Handles EOSError

  Alt 11. Aug 2014, 19:21
Dann sind es wohl keine GDI-Handles (zumindestens nicht in deinem Programm, oder es gab vor dem Knall mal mehr), aber es gibt ja noch massig andere Handles (Dateien, Speicher, Ports usw.).
Aber da es in CreateWnd knallt, liegt der Verdacht nunmal nah, daß es sich um GDI-Handles handeln sollte.
Eventuell geht es auch um ATOMs.

Diese Handles sollten aber global für ganz Windows gelten.
Gibt es denn andere Programme mit vielen Handles?

http://msdn.microsoft.com/de-de/libr.../ms724291.aspx
GDI-Handles sind ein WORD groß und der erste Eintrag wird nicht verwendet (die 0),
was also maximal 65.535 mögliche Handles macht, innerhalb einer Session. (z.B. pro angemeldeten Benutzer)


Du könntest mal mit dem Process Explorer schauen, ob man etwas sieht.

Ach ja, FastMM kann natürlich erstmal nur den Speicher loggen/analysieren, welcher auch noch über ihn reserviert wurde.
Speicher, welchen man direkt bei Windows, oder in einem anderen Speichermanager reserviert, geht an dem ja praktisch vorbei.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (11. Aug 2014 um 19:44 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Der aktuelle Prozess verwendet alle Handles EOSError

  Alt 11. Aug 2014, 18:40
Ist das nicht schon, was man im Taskmanager sich als "GDI-Objekte" anzeigen lassen kann?
Angehängte Grafiken
Dateityp: png gdi objs.png (49,6 KB, 28x aufgerufen)
  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 22:34 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