Ich habe folgendes Problem:
Ein von mir erstellter Windows-Dienst läuft auf einem Server und erzeugt
PDF's (mit der .NET-Componente von List&Label). Nun ist der Dienst nach der
Erstellung von ca. 2000 PDF's gecrasht mit folgender Exception:
System.AccessViolationException: Es wurde versucht, im geschützten Speicher
zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer
Speicher beschädigt ist.
Das Ganze sagt mir nun nicht sehr viel. Was ich nun aber festgestellt habe
ist, dass der Dienst zum Zeitpunkt des crash's ca. 900MB Speicher belegt.
Wird der Dienst gestartet, so ist der Speicherverbrauch bei ca. 120MB. Ich
habe nun festgestellt, dass für die Erstellung des PDF's der Verbrauch um
2MB hoch geht, danach aber nur um 1.5MB zurück.
Meine Frage ist nun, gibt es Tools, mit dem ich z.B. an einen laufenden
Service connecten kann und schauen, was für Objekte nicht freigegeben
wurden? - Bzw. mit denen ich grundsätzlich schauen kann, welche Objekte sind
aktuell gerade im Speicher geladen und verbrauchen wieviel Speicher?
Zudem noch die Frage: Denkt ihr, dass obige Exception mit dem
Speicherverbrauch und dem "nicht freigeben" zusammenhängen kann? - Ich gehe
davon aus, bin mir aber nicht sicher.
Besten Dank für eure Unterstützung!
Grüsse, Thomas
>Ich habe folgendes Problem:
>Ein von mir erstellter Windows-Dienst läuft auf einem Server und erzeugt
>PDF's (mit der .NET-Componente von List&Label). Nun ist der Dienst nach der
>Erstellung von ca. 2000 PDF's gecrasht mit folgender Exception:
>System.AccessViolationException: Es wurde versucht, im geschützten Speicher
>zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass
>anderer Speicher beschädigt ist.
Nun das ist zwar eine eindeutige Aussage und würde meiner Meinung nach
besagen, das irgend ein Teil deines Programmes entweder verucht ein Stück
speicher zu lesen oder zu beschreiben, was er nicht darf. Das ist i.d.R. ein
falscher
"Zeiger", der auf etwas zeigt, was er nicht freigeben/öresen/schreiben,
etc,. darf.
Schau noch mal in die Windows Logs, ob da was spezielles steht,...
>Das Ganze sagt mir nun nicht sehr viel. Was ich nun aber festgestellt habe
>ist, dass der Dienst zum Zeitpunkt des crash's ca. 900MB Speicher belegt.
Diese Speichernageben sind nicht der reale Speicherverbrauch, die Du mit
dem TaskManager oder dem Process Explorer bekommst. Genau Informationen
warum das so ist, bekommst Du im Netz,...
>Wird der Dienst gestartet, so ist der Speicherverbrauch bei ca. 120MB. Ich
>habe nun festgestellt, dass für die Erstellung des PDF's der Verbrauch um
>2MB hoch geht, danach aber nur um 1.5MB zurück.
Das muss nichts heissen, kann aber auf einen unsaubere freigabe von Heap
Speicher deuten,...das müsste man mal profilen, bzw. debuggen
>Meine Frage ist nun, gibt es Tools, mit dem ich z.B. an einen laufenden
>Service connecten kann und schauen, was für Objekte nicht freigegeben
>wurden? - Bzw. mit denen ich grundsätzlich schauen kann, welche Objekte
>sind aktuell gerade im Speicher geladen und verbrauchen wieviel Speicher?
Wenn es sich um einen reinen .NET Service handelt und Du auch Symbole dafür
hast, dann suche mal mit google einfach nach den begriffen "Debugging .NET
Service"
Bei einem nativen Service, der nicht dir gehört, musst Du mit einem Debugger
wie
WinDbg oder OllyDbg ran, das wird dann schwieriger, da Du mit Assembler und
in den Interna des Prozesses, also auf unterer Ebene debuggen musst,...
>Zudem noch die Frage: Denkt ihr, dass obige Exception mit dem
>Speicherverbrauch und dem "nicht freigeben" zusammenhängen kann? - Ich gehe
>davon aus, bin mir aber nicht sicher.
Ich glaube eher, das es ein "wilder" Zeiger ist, also ein Fehler im
Programm.
Man muss immer im Hinterkopf behalten, das Windows mit Paging arbeitet,
d.h. Du hast quasi 2 bzw. 3 GB (mit /3GB boot.ini switch!) User-Space
Speicher
(Pro -Prozess!) zur Verfügung, der immer mit der Swapfile ergänzt wird, wenn
kein realer Speicher mehr zur Verfügung steht. Solange Du keinen Nachricht
von
Windows bekommst, das Du keinen Virtuellen Speicher mehr hast, also
Swapfile,
sollte alles klappen, auch wenn deine Festplatte rattert und swapt wie irre!
Generell gilt: Wenn Du irgendwas an Speicher reservierst, dann gib es nach
beendigung frei, ganz wichtig,. Ich komme von C/C++ und Asm, da macht
man so was schon automatisch. Das.NET nimmt Dir halt viel ab,...
Schau Dir mal die GC-Klasse des .NET an, das kann Dir bei Speicherfragen
auch helfen,...
Was die Komponente für die PDFs intern macht, kann ichnicht sagen, weil
ich sie nicht kenne, aber wenn dafür Symbole verfügbar sind, dann kann Dir
das schon viel über den Ablauf der Komponente sagen. Ansonsten kannst
Du auch mal den Hersteller anschreiben,, was er denn davon hällt, wenn Du
alle potentiellen eigenen Fehlerquellen ausgeschlossen hast,...
Sicherlich habe andere hier auch noch ideen,...
Ach so, zu der Frage mit dem Speicher und .NET. Das geht mit dem Tool:
[How To: Use CLR Profiler]
http://msdn.microsoft.com/en-us/library/ms979205.aspx
http://download.microsoft.com/download/4/4/2/442d67c7-a1c1-4884-9715-803a7b485b82/clr%20profiler.exe
Grüße
Kerem
--
-----------------------
Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.codeplex.com/restarts
Latest Open-Source Projects: http://entwicklung.junetz.de
-----------------------
"This reply is provided as is, without warranty express or implied."
> Ein von mir erstellter Windows-Dienst luft auf einem Server und erzeugt
> PDF's (mit der .NET-Componente von List&Label). Nun ist der Dienst nach der
> Erstellung von ca. 2000 PDF's gecrasht mit folgender Exception:
> System.AccessViolationException: Es wurde versucht, im geschtzten Speicher
> zu lesen oder zu schreiben. Dies ist hufig ein Hinweis darauf, dass anderer
> Speicher beschädigt ist.
ok, das kann mehreres sein, aber mein
erster Gedanke ist hier, dass da ein Dispose
einer unmanaged Ressource fehlt.
... der zweite, dass Du ggf. das
WorkingSet hochsetzen musst.
[pinvoke.net: SetProcessWorkingSetSize (kernel32)]
http://www.pinvoke.net/default.aspx/kernel32/SetProcessWorkingSetSize.html
Hier einige Grundlagen zu möglichen
Vorgehensweisen/Tools aus einem
früheren Posting von mir:
[CLR Profiler for the .NET Framework 2.0]
http://www.microsoft.com/downloads/details.aspx?FamilyID=a362781c-3870-43be-8926-862b40aa0cd0
[Speicherproblemen auf den Grund gehen]
http://msdn.microsoft.com/msdnmag/issues/06/11/CLRInsideOut/default.aspx?loc=de
[Memory Leak Detection in .Net]
http://www.codeproject.com/useritems/Memory_Leak_Detection.asp
[SOS Debugging Extension (SOS.dll)] für ->WinDbg
http://msdn2.microsoft.com/en-us/library/ms404370(vs.80).aspx
[Debugging Tools for Windows - Overview]
http://www.microsoft.com/whdc/devtools/debugging/default.mspx
[Mini Dump Snapshots and the New SOS]
http://msdn.microsoft.com/msdnmag/issues/05/03/Bugslayer/
ciao Frank
--
Dipl. Inf. Frank Dzaebel [MCP, MVP C#]
http://Dzaebel.NET
willkommen aus VO in der .NET-Welt ;-).
Ich habe mal ein änhliches Problem mit LL12 gehabt. Nach einem Bugfix
von combit war das Problem behoben. Mit welcher LL-Version arbeitest du
denn?
Wie generierst du denn das PDF? Kommt das direkt aus einem Report oder
setzt du mehrere LL-Dateien zusammen?
Viele Grüße
Stephan
Thomas Kehl schrieb:
auch ich benutze list & label 13 in einem Windows-Dienst um PDFs auf einem
server zu erzeugen. Da ich auch bei sehr vielen Druckvorgängen keinerlei
Speicherverlust habe, wäre es interessant zu wissen was du im code genau
machst. Mein erster Gedanke geht da an die Userobjekte bei denen man
eigene Ressourcen dem Druck übergeben kann. Verwendest du solche
Userobjekte? Wenn nicht, dann empfehle ich dir den clr-debugger. Damit
bekommst du u.a. schon einmal raus, welcher Objekttyp den ganzen
Speicherplatz belegt. Interessant wäre evtl. auch eine Logdatei von
list&label.
gruss marcel
Am 09.07.2008, 08:58 Uhr, schrieb Thomas Kehl <t.kehl <"heeb.com>">:
Ich arbeite mit LL13. Ich arbeite eigentlich ganz konventionell - Eine
Druckschleife ohne spezielle Userobjekte. Hier wird eine Vorschau-Datei
erstellt, die ich dann mittels LL-Methode zu einem PDF wandle.
PS: Wie kommst du darauf, dass ich aus der VO-Welt komme? (ist richtig - nur
laufen die zwei Welten schon einige Jahre parallel ;-))
Gruss, Thomas
"Stephan Bomholt" <sbomholt_e...@t-online.de> schrieb im Newsbeitrag
news:g52dop$u82$03$2...@news.t-online.com...
Ich verwende keine Userobjekte. Wie ich Stephan schon geantwortet habe,
verwende ich eine konventionelle Druckerschleife und erstelle via
Vorschau-Datei ein PDF. Das mit dem CLR-Debugger schau ich heute mal an.
Gruss, Thomas
"Marcel Beutner" <in...@obd2-software.de> schrieb im Newsbeitrag
news:op.ud1m750tjbzbwo@mb...
so wie Marcel generiere ich recht komplexe PDFs (hoch und quer
kombiniert aus diversen Reports, zusammenkopieren der LL-Dateien und
dann PDF-Export) in einer Schleife und habe mit LL13 keinerlei Probleme.
Hast du mal _alle_ Objekte, die du so instanziierst, explizit zerstört
mit .Close(), .Dispose() und am besten noch mit ":= NULL" zuweisen?
Achte dabei auch auf Objekte, die in anderen Objekten gespeichert sind,
also Collections u.a.
Ohne Code echt nicht einfach ;-)
Viele Grüße
Stephan
PS: Ähnliche Frage im Vulcan-Forum von dir. Hast du den Dienst in Vulcan
geschrieben?
Thomas Kehl schrieb:
Wie im neuen Thread geschrieben konnte ich das Problem mit der
AccessViolationException lösen. Das Problem lag in den Classmate.NET-DLL's.
Weil ich das im Callstack gesehen habe, habe ich das auch in die Vulcan-NG
gepostet. Dort hat es Filip Fransen gesehen und mir neue Classmate-DLL's
zugesendet. Das klappt nun. Jetzt kaue ich noch am Problem rum bzgl. der
Speicherbenutzung. Diesbezüglich habe ich den schon erwähnten neuen Thread
erstellt.
Der Dienst selbst ist habe ich mit C# erstellt. Dieser benutzt aber DLL's
aus unserer ERP-Anwendung, die ich von VO nach Vulcan migriert habe (mit
Classmate). Funktioniert grösstenteils alles tip top!! - Jetzt wo du's
sagst, kommt mir dein Name auch bekannt vor aus der Vulcan-NG ;-)
Viele Grüsse, Thomas
"Stephan Bomholt" <sbom...@aol.com> schrieb im Newsbeitrag
news:ufeEEyn4...@TK2MSFTNGP02.phx.gbl...