![]() |
Mein Prozess hat auf einmal hundertausende Handles
Liste der Anhänge anzeigen (Anzahl: 2)
Die schrecklichen Dinge passieren immer wenn man eigentlich ins Wochenende wollte.
Ein einziges System beim Kunden hat merkwürdige Probleme. Hier der Ablauf:
Ich hatte diesmal das Glück per TeamViewer fast live dabei sein zu können. Was sehe ich im Task-Manager? Nichts besonderes. Schaue ich später noch einmal: Plötzlich über 650.000 Handles für meinen Prozess. Schwer zu glauben, aber es ist so. Anhang 47750 Ich kann den Fehler bei mir lokal nicht nachstellen. Schaue ich mit dem Process Explorer mir einmal genauer hin, sind die Handles alle zu
Delphi-Quellcode:
:
Device\Afd
Anhang 47751 Ich suche im Internet zu "device afd handle leak" und ähnlichem, werde da aber auf die Schnelle nicht schlau. Meist scheinen es fehlerhafte Treiber zu sein, auch ich habe hier einen vom Kunden eingebundenen Netzwerkdrucker im Verdacht. Hat jemand hier noch schlaue Ideen? Ich bin so frustriert dass ich noch nicht einmal eine Ursache finden kann. Fast 24 Stunden lief alles ohne das geringste Murren, dann fällt plötzlich alles in sich zusammen. Ich werde in der eigenen Anwendung in Zukunft versuchen Dinge wie Speicherfragmentierung und Anzahl der Handles zu protokollieren, aber das hilft einem ja auch nur beim Raten, sollte es bei einem anderen Kunden irgendwann auch einmal auftreten. |
AW: Mein Prozess hat auf einmal hundertausende Handles
Gib' uns bitte mal ein paar mehr Infos zum Programm:
Was macht es grundsätzlich? Was im Besonderen? z. B.: viele Dateizugriffe lokal, im Netz? Drucken, lokal, im Netz? Benutzung von Schnittstellen? WMI? Datenbank? ... Was sonst auch immer, was irgendwelche Handles benötigen könnte? Besonderheiten beim betroffenen Rechner? Betriebssystem, Hardware ... |
AW: Mein Prozess hat auf einmal hundertausende Handles
Das Programm ist monolithische 32 Bit VCL-Anwendung mit ein paar DLLs, die meisten davon auch mit Delphi erstellt. Kompiliert in 10 Seattle.
Es kommuniziert kontinuierlich mit etlichen Geräte über serielle Ports, Ethernet (IPv4, TCP und UDP) und loggt periodisch auf die Festplatte. Es agiert auch als TCP-Server auf mehreren Ports über mehrere Netzwerkkarten. Es ist rund um die Welt im Einsatz und hat keine Probleme damit mehrere Wochen am Stück zu laufen und zu arbeiten. OS ist Windows 7 Pro x64, das System hat 4GB Arbeitsspeicher. Handles? Natürlich überall. Dinge die wir nicht wirklich im Griff haben was da abgeht sind einmal
Gerade letzteres (Anzeigen einer PDF über den TWebBrowser) treibt den HandleCount der Anwendung in die Höhe, möglich dass da etwas nicht ganz sauber ist. Die absolut wahnsinnige Zahl von 650.000 Handles erklärt es trotzdem nicht allein, da hätte jemand mehrere tausend male etliche Seiten PDF wälzen müssen. Und wie gesagt, es ist nur dieses eine System, andere Fälle sind mir nicht bekannt. |
AW: Mein Prozess hat auf einmal hundertausende Handles
Einziges System bei diesem Kunden?
System überprüfen, ob Hard- und Software ordnungsgemäß installiert sind und reibungslos funktionieren. Gibt es irgendwelche Auffälligkeiten im Ereignisprotokoll, ggfls. auch zu anderen Themen? Irgendwelche Auffälligkeiten bei Benutzung anderer Software auf dem Rechner bekannt? Wenn die Software weltweit reibunglos funktioniert, dann sicherlich auch auf unterschiedlicher Hardware in den vielfältigsten Hard- und Softwarekombinationen. Das scheint ja kein Problem zu sein. Von daher würd' ich bei der Fehlersuche den Schwerpunkt auf den konkreten Rechner und seine Analyse legen und nicht auf eure Software. Oder anders formuliert: Ich vermute da eher eine difuse Fehlerquelle in dem speziellen System und der dort vorhanden Soft- und Hardware. Irgendwelche besondere Anforderungen an die Hardware vorhanden? Ansonsten Maschine gegen anderes System austauschen und schauen, ob das Problem bestehen bleibt. Wenn ja, dann liegt der Fehler irgendwo außerhalb des System, d. h.: Irgendeine "externe" Stelle, mit der kommuniziert, wird arbeitet nicht ordentlich, so dass euer System (oder auch das Betriebssystem) damit nicht zurechtkommt und von daher (von welchen Operationen auch immer) irgendwelcher Reste übrigbleiben, die das System (früher oder später) in die Knie zwingt. Da könnte z. B. ausgehend von Deiner Beschreibung eine nicht sauber arbeitende Netzwerkverbindung mit ursächlich sein. Da hilft ggfls. mal Kabel tauschen. Nicht nur am Rechner selbst, sondern auch die, die sonstwo weiter in die nähere oder weitere Netzwerkwelt reichen. Hast Du 'nen Netzwerkmonitor zur Verfügung, mit dem Du regelmäßig alle vom Rechner aus zwingend erreichbaren "Gerätschaften" anpingen kannst, um über die Ergebnisse feststellen zu können, ob da irgendwo was klemmt? |
AW: Mein Prozess hat auf einmal hundertausende Handles
Kann der Kunde testweise das Programm auf einem anderen Rechner installieren und nutzen?
|
AW: Mein Prozess hat auf einmal hundertausende Handles
Vielen Dank für die Antworten.
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Es war ja heute so dass ca. 24 Stunden keine Auffälligkeit war, alles sauber, plötzlich fällt alles in sich zusammen weil Windows wohl die Handles ausgehen. Ich habe halt noch die Hoffnung dass ich mit dem "Device\Afd" irgendwie weiterkomme... |
AW: Mein Prozess hat auf einmal hundertausende Handles
Zitat:
Was ich bisher weiß / erahne: Es hängt mit der adf.sys zusammen. WinSocket ist irgendwie betroffen. (Kann auch im Zusammenhang mit dem Printspooler stehen. Druckvorgänge können hier also betroffen sein. Werden bei dem Kunden irgendwelche exotische Druckertreiber genutzt, die sonst kein anderer Kunde nutzt?) Die Handles bleiben übrig, wenn Sockets nicht geschlossen werden. Nach alldem, was ich so überflogen habe, würd' ich hier ein Problem in der "Netzwerkumgebung" und/oder im "Druckerumfeld" vermuten. Es scheint so, als würden nicht alle Verbindungen ordentlich arbeiten und/oder beendet werden. Keine Ahnung ob hiervon was irgendwie helfen könnte: ![]() ![]() ![]() ![]() |
AW: Mein Prozess hat auf einmal hundertausende Handles
LOL mir gingen die Handles verloren und du hast mehr als genug davon.
gruss |
AW: Mein Prozess hat auf einmal hundertausende Handles
Es gibt mit dem AFD zwar weniger Probleme als mit der AfD :cyclops: aber wenn, dann richtig. Zum Beispiel gab es mal einen Bug, aufgrund dessen bei der Wiederverwendung von Sockets Handle Leaks auftraten:
![]() Windows 7 war davon aber offenbar nicht betroffen, ich selbst hatte das Problem mit Vista. Die wichtigste Frage ist aber deshalb erst einmal: Sind dort alle verfügbaren Windows-Updates eingespielt? Die andere Frage: Konntest du einmal stichprobenartig die Handleanzahl beobachten? Steigt diese im normalen Betrieb an oder bleibt diese da konstant? Wie ist es bei euch auf einer Testmaschine? Sprich ist das Verhalten dort schon vor dieser großen Anzahl an Handles anders als bei euch im Test? Packt ihr fertig vorkonfigurierte Images drauf, auf die ggf. nur noch die Software kommt oder wird danach noch alles eingerichtet? |
AW: Mein Prozess hat auf einmal hundertausende Handles
Zitat:
Zitat:
Zitat:
|
AW: Mein Prozess hat auf einmal hundertausende Handles
Eventuell vergessen im Fehlerfall noch offene Handles zu schließen? Try...except...end?
|
AW: Mein Prozess hat auf einmal hundertausende Handles
Dann, denke ich, würde das bei allen Installation auftreten und höchstwahrscheinlich auch die Handle-Anzahl mit der Zeit kontinuierlich wachsen.
Ich werde zunächst irgendwie mal ein bisschen Logging einbauen was die Handle-Anzahl des eigenen Prozesses angeht, bei dem Kunden aktivieren und ansonsten denke ich darüber nach alle Druckvorgänge in einen eigenen Prozess auszulagern, den könnte man nach jedem Druck-Vorgang schließen... |
AW: Mein Prozess hat auf einmal hundertausende Handles
Zitat:
Eventuell knallt es ja auch nur bei diesem Kunden, dann würde eine falsche Fehlerbehandlung auch nur da zuschlagen. |
AW: Mein Prozess hat auf einmal hundertausende Handles
War denn 23 Stunden und 59 Minuten alles gut und schön und grüne Wiese mit Regenbogeneinhörnern mit Puschelschwänzchen UND DANN ging der Hades auf und verschlang alle Handles des Systems ODER stieg nur für dieses System kontinuierlich vom Start an im Laufe der Zeit die Anzahl der Handles?
Workaround Idee 1: Ist es praktikabel eure Anwendung alle XX Stunden automatisch neu zu starten? Workaround Idee 2: Druckausgaben in PDF umleiten und die dann später zum Netzwerkdrucker schicken? Idee von Luckie nochmal aufgreifen und alle Try-Handler angucken. Irgendwo werden Handles im Fehlerfall nicht zu gemacht. Wird der Fehler wirklich protokolliert? Ggf. schluckt das einfach die RTL oder sonstige verbaute Internet-Komponenten und man bekommt nichts mit? |
AW: Mein Prozess hat auf einmal hundertausende Handles
Nur der Vollständigkeit halber:
Natürlicgh kann es sein, dass z.B. ein Usermdedriver des Druckers/Printsystems hier durchdreht und die Handles nicht im eigenen, sondern in fremden Code entstehen (dort nicht richtig freigegeben werden). Mit einem anderem Programm drucken und da schauen, ob das Problemchen dort auch auftritt. PS: Man kann die eigene Anwendung auch auf mehrere EXEn verteilen und das Ausdrucken in einem Subsystem erledigen, damit der Hauptprozess störungsfreier arbeiten kann. |
AW: Mein Prozess hat auf einmal hundertausende Handles
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: Mein Prozess hat auf einmal hundertausende Handles
Etwas zum Loggen.
![]() Wir hatten auch ab und an mal Probleme mit irgendwelchen Ressourcen, in einem Service, beim Kunden. Bei uns läuft daher im Hintergrund ein Thread, der regelmäßig danach schaut und das loggt. So können wir dann nachsehen wann in der letzten Woche sich dort was änderte. > Speicher (HDD, System-Memory, VirtualMemory, DelphiMM-Allocation), Handles, Threads, CPU-Auslasung (Prozess und System), Status einiger Locks (CritialSections), ... |
AW: Mein Prozess hat auf einmal hundertausende Handles
|
AW: Mein Prozess hat auf einmal hundertausende Handles
OT:
Das Schlimme ist, das bei solchen aufwendigen und zeitraubenden Fehlern die Ursache sich innerhalb von ein bis drei Zeilen Quelltext finden und fixen lässt. Der Aufwand zur Fehlersuche und tatsächliche Fehlerbehebung stehen oft in einen krassen Missverhältnis. |
AW: Mein Prozess hat auf einmal hundertausende Handles
Oh ja. Aber noch viel schlimmer als diese drei Zeilen (die potentiell noch bei anderen Kunden zutreffen könnten) wäre die Tatsache wenn es sein beschissener Netzwerkdrucker ist den es nur bei ihm gibt :twisted:
|
AW: Mein Prozess hat auf einmal hundertausende Handles
Hallo,
mal ganz naiv ... steht das Problem ev. in Zusammenhang mit der 24 Stunden Angabe? Oder ist die Aussage ... alles läuft 23 h 59 min problemlos ... mehr symbolisch zu verstehen. Ich denke da an solche Sachen, wie Zeitumrechnung über einen 24 Std. Zeitraum hinweg und dann entsprechende Überläufe und die vielen Handles sind dann nur ein Folgeproblemm. |
AW: Mein Prozess hat auf einmal hundertausende Handles
Gute Frage, aber das war wirklich nur rein symbolisch zu verstehen. Im ersten Fall weiß ich nicht wie lange es lief, im zweiten Fall waren es so um die 22 Stunden.
|
AW: Mein Prozess hat auf einmal hundertausende Handles
Ach, wer hat nicht so Quelltextzeilen:
Delphi-Quellcode:
Die heißen natürlich in der Realität SendDocToNetworkPrinter, LoadDataFromDatabase, SaveApplicationSetting usw. usf.! :-D
if Now > zufälligerWert then
RasteKomplettAusUndBringeDasSystemZumAbsturz; |
AW: Mein Prozess hat auf einmal hundertausende Handles
Erst einmal vielen Dank noch einmal für die Antworten.
So wie es mittlerweile aussieht ist nach dem Zurückstellen auf den von uns gelieferten Drucker das Wochenende über nichts mehr vorgefallen, alles lief bestens. Naja, dafür loggt die Anwendung in der nächsten Version auch fleißig Dinge mit wie Handle-Anzahl, CPU/Speicher-Auslastung, Anzahl der IO-Vorgänge auf der Platte... Hatte also auch sein Gutes 8-) |
AW: Mein Prozess hat auf einmal hundertausende Handles
Also lag es letztendlich an einen fehlerhaften Drucker(-treiber)?
Spannend und nur nice-to-have wäre natürlich, den fehlerhaften Drucker vom Kunden (leihweise) zu bekommen und in der Entwicklung testen zu können. Eventuell kann man derartige Fehler-Szenarien auch im eignen Programmcode behandeln. Aber das wäre auch nur was für ruhige Stunden. |
AW: Mein Prozess hat auf einmal hundertausende Handles
Zitat:
Der Drucker selbst muss ja nicht angeschlossen sein. Den Treiber auswählen und die Druckaufträge im Spooler stehen lassen. Kann man dann dort ja später rausschmeißen. Die grundsätzliche Funktion von Druckaufträgen hab' ich immer erstmal mit ausgeschaltetem Drucker entwickelt und getestet bzw. den Drucker am Entwicklungsrechner offline geschaltet. Ein eventuell vorhandenes Fehlverhalten des Druckertreibers müsste aber eigentlich trotzdem auffallen. |
AW: Mein Prozess hat auf einmal hundertausende Handles
Zitat:
Das wäre Schritt eins. Wenn sich das Fehlverhalten damit aber nicht reproduzieren lässt, kommt man um eine vollständige Testkette nicht drum rum. |
AW: Mein Prozess hat auf einmal hundertausende Handles
Zitat:
|
AW: Mein Prozess hat auf einmal hundertausende Handles
Deutet das aber dann nicht auch auf eine unvollständige Fehlerbehandlung im Code hin?
|
AW: Mein Prozess hat auf einmal hundertausende Handles
Um welchen Fehler handelt es sich in meinem Programm, wenn ein Druckertreiber Handles nicht freigibt?
Welche Chance der Fehlerbehebung habe ich denn dann? Allenfalls kann ich doch nur das Problem feststellen und ggfls. warnen ... aber die Chance der Fehlerbehebung im eigenen Programm dürfte da doch eher gegen 0 tendieren. Oder irre ich da? |
AW: Mein Prozess hat auf einmal hundertausende Handles
Du hast doch gesagt, das dein Prozess die Handles verbraucht und zu deinem Prozess gehören. Also werden sie auch in deinem Prozess erzeugt. Und somit bist du auch für deren Freigabe zuständig. Also irgendwas stimmt da nicht.
|
AW: Mein Prozess hat auf einmal hundertausende Handles
Hmm..
Zitat:
Es gibt Windows-APIs welche manchmal ihre intern erzeugten Handles nicht wieder freigeben oder zu exceptions führen. Dadurch, dass deine App diese API aufruft, wird durch das Laden der zugehörigen DLL diese in deinen Prozess verfrachtet und seitens Windows als deine Handles/Exceptions angenommen. Dies ist bei Treibern nicht anders... |
AW: Mein Prozess hat auf einmal hundertausende Handles
Zitat:
Der Kunde, bei dem das Problem auftritt, konnte es dadurch beheben, dass der zu verwendenden Drucker auf die Ausgangskonfiguration zurückgestellt wurde, also den von der zu Software zu verwendenden Drucker änderte. Welches Problem muss jetzt in dem Programm behoben werden, das nur bei der Nutzung eines bestimmten Druckers Probleme mit Handles bekommt, aber sonst 24/7 problemlos bei der Zusammenarbeit mit beliebigen anderen Druckern funktioniert? Oder anders formuliert: Wieso bin ich für Fehler verantwortlich, die von mir genutzte Druckertreiber ... enthalten und wie kann ich diese Fehler beheben, ohne Zugriff auf die Quelltexte dieser Treiber zu haben? |
AW: Mein Prozess hat auf einmal hundertausende Handles
War nur eine Idee.
|
AW: Mein Prozess hat auf einmal hundertausende Handles
Die Jahre zogen uns Land, und heute bin ich wieder an einer Kiste, das gleiche Szenario:
Unsere Anwendung läuft erst seit wenigen Minuten, frisst aber ein halbes Gigabyte Speicher und hat 925.000 Handles! Wieder Device\Afd. Immerhin bleibt die Anzahl konstant. Ausgeliefert wurde die Kiste um den gleichen Zeitraum wie damals das System. Ich vermute schon eher einen Bug in Windows/Windows Patch zu diesem Zeitpunkt, wäre nicht das erste mal gewesen. |
AW: Mein Prozess hat auf einmal hundertausende Handles
Wie ist denn der Windows-Stand (winver)?
Sind Updates eingespielt? Hier irgendwas dabei, was du nicht schon kennst? ![]() |
AW: Mein Prozess hat auf einmal hundertausende Handles
Heute trat es wieder auf, und ich konnte es endlich reproduzieren.
Es ist eine Verkettung unglücklicher Zustände:
Das war echt einer der spannendsten Bugs seit langer Zeit :cyclops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:53 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