Laden...

Problem mit Speicherverbrauch bei mehrfachem Aufruf einer Methode (P/Invoke)

Erstellt von B A L U vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.303 Views
B A L U Themenstarter:in
134 Beiträge seit 2007
vor 12 Jahren
Problem mit Speicherverbrauch bei mehrfachem Aufruf einer Methode (P/Invoke)

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...

6.911 Beiträge seit 2009
vor 12 Jahren

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!"

B A L U Themenstarter:in
134 Beiträge seit 2007
vor 12 Jahren

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.130 Beiträge seit 2007
vor 12 Jahren

😁
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.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

Gelöschter Account
vor 12 Jahren

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.

C
2.121 Beiträge seit 2010
vor 12 Jahren

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...

B A L U Themenstarter:in
134 Beiträge seit 2007
vor 12 Jahren

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.

Hinweis von gfoidl vor 12 Jahren

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.