Announcement

Collapse
No announcement yet.

AccessViolationException

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • AccessViolationException

    Hallo,
    ich bekomme seit kurzen die Exception:
    AccessViolationException "Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben"
    Das passiert bei jedem Projekt im VS2008 (ob neu oder alt) ob vb.net oder c#.
    Wenn ich zum Debuggen Strg+F5 auswähle tritt die Meldung nicht auf. Kann mir jemand Helfen?

    Danke

  • #2
    Direkt helfen kann ich Dir zwar nicht, aber vielleicht bei der Fehlersuche ein paar Tipps geben:

    Der beschriebene Fehler (ich kenne ihn aus C++) rührt üblicherweise daher, das Objektverweise verfolgt werden, die nicht mehr gültig sind, weil entweder das Objekt zerstört wurde, oder im virtuellen Speicher ausgelagert ist, und die Speicherverwaltung dies nicht mitbekommen hat/nicht an das Programm zurückgemeldet hat. D.h. dann, dass der Speicherbereich, auf den der Verweis zeigt, inzwischen einem anderen Prozess gehört, oder das System den Bereich inzwischen für sich reserviert hat, und er damit speziell geschützt ist. Dass die Meldung beim Debuggen nicht auftritt, liegt daran, dass der Debugger den Speicherbereich des zu debuggenden Programmes verwaltet und dieser Art von Fehlern vorbeugt. Dass er dabei nicht mehr eine korrekte Testsituation herstellt, ist ein Problem das man sich durch die Laufunterstützungerkauft. Ist übrigens das gleiche Phänomehen, wie mit Variablen, die im Debugger mit 0 vorbelegt werden, in der "echten" Version dann aber den Wert haben, der zufälligerweise im Speicher lag, als dieser Speicher der Variablen zugeordnet wurde.

    Zunächt müsstest Du diesen Fehler abfangen, und irgendwie den Stack Trace ansehen, um festzustellen, wo genau der Fehler auftritt, d.h. ob er jedesmal in der gleichen Funktion bzw. dem gleichen Zugriff stattfindet. Ebenso lohnt es sich, nachzusehen, wo Du überall ein Objekt explizit zerstörst (mit Dispose()) und danach das entsprechende Objekt explizit auf Nothing setzen.

    Tust Du das nämlich nicht, weiß das Programm hinterher nicht mehr, dass das Objekt schon zerstört ist, die Speicherverwaltung hat aber schon den Befehl bekommen, den Speicher anderen Prozessen zur Verfügung zu stellen, und wie das so ist bei geteilten Ressourcen, kaum gibst Du was frei, ist der nächste schon da und krallt sich das. Wie beim Fondue in der Familie: Kaum lässt Du mal deine Gabel ein paar Sekunden aus den Augen, hat Dir Dein Bruder das Rindfleich gemopst und mit brät mit Deiner Gabel seine Pute. Dein Programm meint nun das nächste mal, wenn es sich dem Objekt zuwendet, es sei immer noch sein Rindfleich, und stirbt am allergischen Schock, weil es keine Pute verträgt.

    Ich hoffe das gibt wenigstens Anhaltspunkte zur Fehlersuche

    Comment

    Working...
    X