Hallo.
Ich benutze folgende Methoden, um alle Prozesse zu ermitteln, die einen Datei blockieren. Bei mehrfachem Aufruf der Methode steigt mein Speicherverbrauch ins unermessliche, und die Dauer für die Ausführung des Scripts steigt von 5 Sekunden auf 2 Minuten.
Gibt es darin irgendwo ein Memory Leak? Mir ist erstmal keiner aufgefallen. Gibt es irgendeine Möglichkeit, herauszufinden welcher Teil so viel Speicher benötigt?
Vielen Dank im Voraus
B A L U
Edit: Code zwecks Unübersichlichkeit entfernt...
Hallo,
Gibt es irgendeine Möglichkeit, herauszufinden welcher Teil so viel Speicher benötigt?
Profiler nennen sich diese Teile.
Hast du beim allem was IDisposable implementiert auch Dispose aufgerufen bzw. in einen using-Block gepackt. Sind alle Handles freigegeben?
Aber es ist wirklich dein Ernst zu glauben dass sich jemand durch deinen Code wurstet? Bitte beachte auch [Hinweis] Wie poste ich richtig? Punkt 4.c, 4.a!
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Sorry für den ewig langen Code. Habe erst nach dem Absenden bemerkt, wieviel das eigentlich ist. Tut mir Leid.
Das mit dem Handels freigeben werde ich mal überprüfen.
😁
1.) Es fehlt einmal Marshal.FreeHGlobal(ipHandlePointer); vor dem return
2.) RtlFreeUnicodeString
3.) Auf DuplicateHandle muss immer CloseHandle folegen, genauso auf OpenProcess
Tipp: Wenn du die Handles durchgehst, dann kannst du die Dateihandles bereits von anderen unterscheiden: ObjectTypeNumber
Um an die richtige Konstante zu gelangen musst allerdings ersmal ein Dateihandle gefunden haben. Du kannst dazu entweder eine datei selber öffnen (FileStream.Handle) und das handle in der Liste suchen, oder dir beim ersten Fund eines Dateihandles die Id merken. Das Spart enorm Aufrufe von DuplicateHandle.
Außerdem finde ich es mit dem Marshal deutlich unübersichtlicher als mit unsafe Pointern.
Ja es ist wirklich zuviel Code. Floste hat ja schon einen guten Hinweis gegeben.
Was ich tun würde ist neben dem Einsatz eines Profilers Codeabschnitte zu entfernen und die Funktion in einer Schleife von mir aus 1000 mal aufzurufen um zu sehen ob der Speicherverbrauch immer noch so ansteigt, wenn nicht den nächsten Abschnitt hinzufügen, wieder 1000 mal usw. Blöd irgendwie aber so kommt man Problemen die im unmanaged Bereich liegen oft gut auf die Spur.
Es ist zwar recht lang, aber so wahnsinnig viele Methoden sind es ja gar nicht.
Um der Laufzeit auf die Spur zu kommen würd ich die Methodenaufrufe zählen. Bau Zählvariablen in die Klasse und lass dir am Ende ausgeben was wie oft aufgerufen wurde. Dann kannst du vielleicht noch die Gesamtlaufzeit stoppen usw. und so kommst du dann irgendwann drauf, wo die Zeit verbraten wird.
Vielleicht passt nur irgendwas mit den Schleifen nicht, oder es blockiert sich etwas gegenseitig durch parallele Aufrufe?
Evtl. löst sich die Frage mit dem Speicherverbrauch dann automatisch, wenn du weißt wo das Programm sich lange aufhält und was es da macht.
Die MessageBoxen würd ich rausnehmen, dadurch geht ja schon einiges an Zeit drauf. Lass das lieber in Debug.WriteIrgendwas schreiben, wie das eben genau heißt...
Danke für die vielen Anworten. Durch die Tipps von Floste läuft das ganze schon wesentlich performanter. Allerdings habe ich noch eine Frage:
Wo müsste den in der Funktion das RtlFreeUnicodeString eingebaut werden? Ich konnte mein Speicherproblem jetzt auf diese Funktion zurückführen. Wenn ich vor dem Return die Funktion RtlFreeUnicodeString auf objObjectName.Name anwende, erhalte ich eine Accessviolation.
Danke noch mal im Voraus, für eure Zeit.
Bitte beachte auch [Hinweis] Wie poste ich richtig? Punkt 4.a, 4.c, 4.1
Das Forum ist nicht dazu da deine Code zu debuggen. Genügend Hinweise hast du ja bekommen wie du selbst zur Lösung kommst. Beachte das bitte. Beim nächsten mal ist das Thema geschlossen.