myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » [erledigt] Speicherfehler wegen vergessener Freigabe der COM Objekte
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

[erledigt] Speicherfehler wegen vergessener Freigabe der COM Objekte

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Wolf_maYer Wolf_maYer ist männlich
myCSharp.de-Mitglied

avatar-2284.jpg


Dabei seit: 05.07.2006
Beiträge: 286
Entwicklungsumgebung: MS Visual C# 2005 - MSSQL 2005
Herkunft: Bochum


Wolf_maYer ist offline

[erledigt] Speicherfehler wegen vergessener Freigabe der COM Objekte

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,
es tut mir furchtbar leid, dass jetzt warscheinlich eine Glaskugel-Frage stelle. Ich hocke nur schon seit Heute Morgen vor zahlreichen Speicherfehlern, bei denen ich einfach nicht weiter komme.

Eine der Fehlermeldung schaut wie folgt aus:

Zitat:
Fehlermeldung: Exception of type 'System.OutOfMemoryException' was thrown.
StackTrace: at System.Threading.Thread.StartInternal(IPrincipal principal, StackCrawlMark& stackMark)
at System.Threading.Thread.Start()
at System.Threading.Thread.Start(Object parameter)

Die Fehlermeldung sagt ja aus, dass es sich hierbei um einen Fehler handelt, bei dem der Arbeitsspeicher voll ist und dem Betriebssystem keiner mehr zur Verfügung steht. Das kann aber nicht sein, da noch ca. ein GB frei ist.

Ein anderer Fehler an einer ganz anderen Stelle lautet:

Zitat:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
StackTrace: at System.Reflection.AssemblyName.nInit(Assembly& assembly, Boolean forIntrospection, Boolean raiseResolveEvent)
at System.Reflection.AssemblyName.nInit()
at System.Reflection.AssemblyName..ctor(String assemblyName)
at System.Resources.ResourceManager.CanUseDefaultResourceClasses(String readerTypeName, String resSetTypeName)
at System.Resources.ResourceManager.CreateResourceSet(Stream store, Assembly assembly)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture, Boolean wrapUnmanagedMemStream)
at System.Resources.ResourceManager.GetObject(String name)

Jetzt stehe ich leider komplett vor einer Wand, bei der ich icht weiß wo ich anfangen soll zu suchen.

Gibt es vielleicht eine Möglichkeit, mit der man Erfahren kann, ob und womit ein Programm oder ein Teil eines Programms diese Speicherfehler verursacht? Ich glaube, dass die Ursache nicht an der ist, an der der Fehler auftritt sondern an einer ganz anderen, die ich momentan einfach icht auf dem Schirm habe.

Wie Ihr merkt, greife ich gerade nach dem letzten Strohhalm und freue mich auf irgendeinen noch so kleinen Tip.

Viele Grüße, maYer

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Wolf_maYer am 25.09.2007 15:55.

Neuer Beitrag 24.09.2007 16:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
wdb.lizardking wdb.lizardking ist männlich
myCSharp.de-Mitglied

avatar-2010.jpg


Dabei seit: 28.08.2006
Beiträge: 100
Entwicklungsumgebung: Visual Studio .NET 2008
Herkunft: Niederbayern


wdb.lizardking ist offline Füge wdb.lizardking Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ein Profiler-Tool könnte dir möglicherweise weiterhelfen, etwa das kostenlose  ProfileSharp.

Neben dem normalen Performance-Modus, der dir anzeigt in welchen Funktionen dein Programm die meiste Zeit verweilt, gibt es auch einen Memory-Modus zur Suche von Speicherlöchern.

Bei der Gelegenheit stellt sich die Frage, ob es in C# einen new_handler wie bei C++ gibt smile

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von wdb.lizardking am 24.09.2007 16:44.

Neuer Beitrag 24.09.2007 16:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.464
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Wolf_maYer,

Zitat:
Die Fehlermeldung sagt ja aus, dass es sich hierbei um einen Fehler handelt, bei dem der Arbeitsspeicher voll ist und dem Betriebssystem keiner mehr zur Verfügung steht. Das kann aber nicht sein, da noch ca. ein GB frei ist.

Speicher != Arbeitsspeicher. Es kann auch sein, dass kein Speicher mehr für die Verwaltung von Threads vorhanden ist, also kein Speicher mehr in bestimmten interen Datenstrukturen des Betriebssystems.

herbivore
Neuer Beitrag 24.09.2007 16:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Wolf_maYer Wolf_maYer ist männlich
myCSharp.de-Mitglied

avatar-2284.jpg


Dabei seit: 05.07.2006
Beiträge: 286
Entwicklungsumgebung: MS Visual C# 2005 - MSSQL 2005
Herkunft: Bochum

Themenstarter Thema begonnen von Wolf_maYer

Wolf_maYer ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,
danke ihr Beiden. Ihr macht mir Mut, dass es mit viel Mühe ja doch noch zu knacken ist.

Es ist so, dass wir mit einem C++ Bereich Arbeiten, der den CSharp Teil aufruft. Es ist leider momentan nicht anders zu handeln.
Kann es sein, dass im C++ Bereich irgendetwas falsch Initialisiert ist o.Ä., was mich dann im C# Teil mit meinem Threadding in die Knie zwingt? Ich weiß leider nicht, wie ich das besser umschreiben soll.

Den Profiler werde ich mir mal gründlich anschauen. Aber ich glaube, dass die eigentlichen Fehler im C++ Teil liegen. Ich hatte vorher eigentlich nie Probleme mit Speicherbereichen obwohl ich MultiThreadding ausgiebig genutzt habe.

Gruß, maYer
Neuer Beitrag 24.09.2007 17:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
sarabande
myCSharp.de-Mitglied

avatar-2450.jpg


Dabei seit: 22.02.2007
Beiträge: 230


sarabande ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Treten die Exceptions immer in der gleichen Reihenfolge auf und sind es ausschliesslich memory Fehler? Programm schon auf einem rohen OS Rechner oder in einer VM getestet? Dlls in C++? oder alles schon gemischt?
Neuer Beitrag 24.09.2007 17:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
svenson svenson ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.04.2005
Beiträge: 8.746
Entwicklungsumgebung: Visual Studio .NET 2003
Herkunft: Berlin


svenson ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wie viele Thread machst du denn so auf?
Neuer Beitrag 24.09.2007 22:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Wolf_maYer Wolf_maYer ist männlich
myCSharp.de-Mitglied

avatar-2284.jpg


Dabei seit: 05.07.2006
Beiträge: 286
Entwicklungsumgebung: MS Visual C# 2005 - MSSQL 2005
Herkunft: Bochum

Themenstarter Thema begonnen von Wolf_maYer

Wolf_maYer ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi Sarabande,
es waren bis jetzt ausschließlich Speicher Fehler.
Heute ist noch ein neuer Fehlertyp dazu gekommen:

Zitat:
Fehler: Error creating window handle.
StackTrace: at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.TextBoxBase.CreateHandle()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e)
at System.Windows.Forms.Control.OnParentVisibleChanged(EventArgs e)
at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e)
at System.Windows.Forms.ScrollableControl.OnVisibleChanged(EventArgs e)
at System.Windows.Forms.Form.OnVisibleChanged(EventArgs e)
at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
at System.Windows.Forms.Control.set_Visible(Boolean value)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()

Wir haben es noch nciht auf einem Cleanen Rechner laufen gelassen sondern auf den üblichen Testrechnern, auf denen das Programm sonst auch immer gelaufen ist.

Bei den C++ Geschichten handelt es sich ausschließlich um DLL´s.

@Svenson:
ich habe eigentlich immer nur einen Thread offen um die Datenoperationen durchzuführen und die GUI nicht zu blockieren. Der Benutzer bekommt einen InfoDialog mit einer Progressbar angezeigt.

Mit dem Profiler werde ich mich heute anfreunden und werde einmal schauen, was er mir so erzählt.

Gruß und vielen Dank für die Denkanstöße,
maYer
Neuer Beitrag 25.09.2007 10:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.464
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Wolf_maYer,

Zitat:
Heute ist noch ein neuer Fehlertyp dazu gekommen

auch das kann ein Speicherfehler sein, wenn das Erzeugen des Handles nicht funktioniert, weil (in den internen Datenstrukturen) kein Speicher mehr für einen neuen Handle ist.

Insgesamt sieht es so aus, also würde dein Programm massig Ressourcen (Thread, Controls, Handles) anfordern, ohne sie wieder freizugeben. Hast du irgendwo eine Endlosrekursion oder eine Endlosschleife, die das verursacht?

herbivore
Neuer Beitrag 25.09.2007 10:28 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Wolf_maYer Wolf_maYer ist männlich
myCSharp.de-Mitglied

avatar-2284.jpg


Dabei seit: 05.07.2006
Beiträge: 286
Entwicklungsumgebung: MS Visual C# 2005 - MSSQL 2005
Herkunft: Bochum

Themenstarter Thema begonnen von Wolf_maYer

Wolf_maYer ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hmm,
also das Programm, welches wir schreiben ist eine Integration in eine CAD-Anwendung. Dementsprechend Speicher benötigt die komplette Anwendung.

Ich selber bin nicht für den kompletten Code zuständig sondern nur für ca. 35% des C# Codes (Datenbank Anbindung und ein paar Funktionalitäten in der BI)

Der C++ Code wird von einem anderen Entwickler verwaltet, gewartet und erweitert.
C++ ist deswegen noch enthalten, weil die Integration beim Projektstart nur unter C++ realisierbar gewesen ist. Inzwischen gibt es auch ein C# Interface.

Ich werde ihn einmal anhauen, ob er seine Bereich auf diese Vermutung hin untersuchen kann.
Neuer Beitrag 25.09.2007 10:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
wakestar wakestar ist männlich
myCSharp.de-Mitglied

avatar-2643.jpg


Dabei seit: 15.11.2006
Beiträge: 383
Entwicklungsumgebung: Dynamics NAV & Visual Studio
Herkunft: Luzern


wakestar ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Wolf_maYer

Dieser Artikel befasst sich mit der OutOfMemoryException - Problematik:

 https://blogs.msdn.com/yunjin/archive/2004/01/27/63642.aspx

Gruss
wakestar
Neuer Beitrag 25.09.2007 12:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
svenson svenson ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.04.2005
Beiträge: 8.746
Entwicklungsumgebung: Visual Studio .NET 2003
Herkunft: Berlin


svenson ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Es ist doch offensichtlich ein Problem von nicht-verwalteten Ressourcen. Die Frage ist doch nur, wer damit rumsaut. Der .NET bzw. der C++-Teil.

Dazu einfach die Leistungsanzeige (Systemsteuerung/Verwaltung) starten und den Indikator .NET CLR Speicher / Anzahl der GC Handle auswählen.

Üblicherweise benötigt ein UI-Programm ein paar Dutzend bis ein paar hundert Handles. Falls dein Programm schuld ist, dann wird sich hier der Wert in zweistellige Tausenderzahlen schwingen.

Dann fehlen wahrscheinlich nur Dispose()-Aufrufe - wie schon vermutet.
Neuer Beitrag 25.09.2007 12:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Wolf_maYer Wolf_maYer ist männlich
myCSharp.de-Mitglied

avatar-2284.jpg


Dabei seit: 05.07.2006
Beiträge: 286
Entwicklungsumgebung: MS Visual C# 2005 - MSSQL 2005
Herkunft: Bochum

Themenstarter Thema begonnen von Wolf_maYer

Wolf_maYer ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,
wir sind schon einmal so weit, dass wir den Bereich eingrenzen können an dem der Mist passiert.

Es scheint wohl so zu sein, dass ich ein COM-Objekt aus der Fremdapplikation aufrufe und dieses nicht wieder richtig frei gegeben wird.

Ein ähnliches Problem trat im C++ Bereich auch schon auf, dass mit einem "Detach auf dem Pointer sobald der Code mit der Arbeit auf dem Objekt fertig war" gelöst wurde.

In C# arbeite ich jetzt nicht mit einem Pointer auf dem Objekt sondern ich Arbeite auf dem Interop Interface und habe dementsprechend keinen Pointer.

Reicht da ein auf NULL setzen?

Gruß, maYer
Neuer Beitrag 25.09.2007 14:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Wolf_maYer Wolf_maYer ist männlich
myCSharp.de-Mitglied

avatar-2284.jpg


Dabei seit: 05.07.2006
Beiträge: 286
Entwicklungsumgebung: MS Visual C# 2005 - MSSQL 2005
Herkunft: Bochum

Themenstarter Thema begonnen von Wolf_maYer

Wolf_maYer ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich versuche es mal mit:

C#-Code:
System.Runtime.InteropServices.Marshal.ReleaseComObject()

gruß, maYer
Neuer Beitrag 25.09.2007 14:53 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Wolf_maYer Wolf_maYer ist männlich
myCSharp.de-Mitglied

avatar-2284.jpg


Dabei seit: 05.07.2006
Beiträge: 286
Entwicklungsumgebung: MS Visual C# 2005 - MSSQL 2005
Herkunft: Bochum

Themenstarter Thema begonnen von Wolf_maYer

Wolf_maYer ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Es läuft jetzt sauber durch.

Vielen Dank für Eure Hilfe Augenzwinkern

Gruß, maYer
Neuer Beitrag 25.09.2007 15:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 12 Jahre.
Der letzte Beitrag ist älter als 12 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 13.11.2019 00:26