web-dev-qa-db-de.com

Es wurde versucht, geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein Hinweis darauf, dass der andere Speicher beschädigt ist

Ich hoffe, dass mich jemand aufklären kann, was diesen Fehler möglicherweise verursacht:

Es wurde versucht, geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein Hinweis darauf, dass anderer Speicher beschädigt ist.

Ich kann nicht wirklich Code schreiben, da dieser Fehler in einem beliebigen Bereich der Anwendung angezeigt wird. Die Anwendung wird zwischen 12 und 48 Stunden ausgeführt, bevor der Fehler ausgegeben wird. Manchmal stoppt es an einem scheinbar zufälligen Punkt und wirft den obigen Fehler aus, manchmal stoppt die gesamte Anwendung und ich erhalte einen Bildschirm mit der Fehlermeldung "Es gab einen schwerwiegenden Fehler in ..." Fehler in der CLR oder ... "etwas über PInvoke oder andere nicht relevante Informationen. Wenn dies geschieht, werden alle Threads beendet und es sind keine Debugging-Informationen verfügbar. 

Kurz gesagt: Dies ist, was die Anwendung tut:

Es ist eine Multithread-Serveranwendung, die vollständig in C # geschrieben ist. Clients stellen über Socket eine Verbindung zum Server her. Der Server führt eine virtuelle "Umgebung" für die Clients aus, in der sie untereinander und mit der Umgebung interagieren können. Es verbraucht ziemlich viel Speicher, aber ich sehe es nicht undicht. Es verbraucht normalerweise etwa 1,5 GB. Ich glaube nicht, dass es undicht ist, weil die Speichernutzung während der gesamten Laufzeit der Anwendung relativ konstant bleibt. Es ist ständig laufender Code, um die Umgebung zu erhalten, auch wenn die Clients nichts unternehmen. Es verwendet keine Drittanbieter-Software oder andere APIs. Die einzigen externen Ressourcen, die diese Anwendung verwendet, sind Socketverbindungen und SQL-Datenbankverbindungen. Es läuft auf einem 64-Bit-Server. Ich habe das Debuggen in VS2008 und VS2010 mit .net 2.0, 3.5 und 4.0 und auf mehreren Servern versucht, und das Problem tritt immer noch auf. 

Ich habe versucht, Compiler-Optimierungen und mehrere Microsoft-Hotfixes zu deaktivieren. Nichts scheint dieses Problem zu beseitigen. Es wäre zu begrüßen, wenn jemand mögliche Ursachen kennt oder auf irgendeine Weise herausfindet, was das Problem verursacht.

111
Someone Else

Schließlich wurde dies mit Hilfe von WinDBG und SOS aufgespürt. Zugriffsverletzung wurde von einer unbekannten DLL ausgelöst. Es stellte sich heraus, dass eine Software namens "Nvidia Network Manager" die Probleme verursacht hat. Ich habe unzählige Male gelesen, wie dieses Problem durch Firewalls oder Antiviren verursacht werden kann. Ich ging auch davon aus, dass es sich nicht um eine Umgebung handelt, da es auf mehr als einem Server mit unterschiedlicher Hardware auftritt. Es stellte sich heraus, dass alle Computer, auf denen ich dies getestet habe, "NVidia Network Manager" ausgeführt haben. Ich glaube, dass es mit den restlichen Motherboard-Treibern installiert wird. 

Hoffentlich hilft dies jemandem, da dieses Problem meine Bewerbung sehr lange geplagt hat. 

17
Someone Else

Ich habe gerade dieses Problem in VS 2013 .NET 4.5 mit einer MapInfo-DLL konfrontiert. Es stellte sich heraus, dass das Problem darin bestand, dass ich die Plattform für Build von x86 in Any CPU geändert habe. Das Zurücksetzen auf x86 hat den Trick geleistet. Könnte jemandem helfen.

39
Sergey

Versuchen Sie, diesen Befehl auszuführen

netsh winsock reset

Quelle: https://stackoverflow.com/a/20492181/1057791

11
BornToCode

Dieses Problem hatte ich auch mit Visual Studio 2010 zu tun. Interessanterweise hatte ich mehrere Projekte in meiner Lösung (Konsolenanwendung, WPF-Anwendung, Windows Forms-Anwendung), die jedoch nur fehlschlugen, als ich das Projekt mit dem Typ "Konsolenanwendung" festlegte "als Startup-Projekt (auch für diejenigen, bei denen buchstäblich kein Code oder zusätzliche Assemblys angegeben wurden, die von den Standardvorlagen, die mit der Projektvorlage selbst geliefert werden) bezeichnet werden. 

Die folgenden Änderungen halfen mir schließlich, das Problem genauer zu bestimmen: Gehen Sie zu den Projekteigenschaften der Konsolenanwendung. Projekt -> Wechseln Sie zur Registerkarte Debug -> Gehen Sie zum Abschnitt Enable Debuggers im rechten Fensterbereich -> Aktivieren Sie das Kontrollkästchen Enable unmanaged code debugging als In der Momentaufnahme unten gezeigt. Die Ursache dafür ist mir immer noch nicht bekannt. Das einzige, was ich beobachtete, war, dass in der vergangenen Nacht viele Windows-Updates auf meinem Computer installiert wurden, die hauptsächlich aus Office-Updates und Betriebssystem-Updates bestanden (mehr als ein Dutzend KB-Artikel).

 enter image description here

11
RBT

Das Problem kann durch gemischte Build-Plattform-DLLs im Projekt verursacht werden. Sie erstellen Ihr Projekt in Any CPU, haben jedoch einige DLLs für x86-Plattformen im Projekt. Diese führen zu zufälligen Abstürzen aufgrund unterschiedlicher Speicherzuordnung der 32- und 64-Bit-Architektur. Wenn alle DLLs für eine Plattform erstellt wurden, kann das Problem gelöst werden.

Dieser Fehler sollte im verwalteten Code nicht auftreten. Dies könnte das Problem lösen:

Wechseln Sie zu Visual Studio Debugger, um diese Ausnahme zu umgehen:

Tools menu ->Options -> Debugging -> General -> Uncheck this option "Suppress JIT optimization on module load"

Ich hoffe es wird helfen.

7
curiousBoy

Ich bin heute auf diese Ausnahme gestoßen und habe eine Lösung gefunden. Es trat auf, als ich versuchte, einen Komponententest (NUnit) zu debuggen, der eine virtuelle Methode für eine abstrakte Klasse aufrief.

Das Problem scheint bei der Installation von .NET 4.5.1 zu liegen.

Ich habe .NET 4.5.2 heruntergeladen und installiert (meine Projekte verweisen immer noch auf .NET 4.5.1), und das Problem wurde behoben.

Quelle der Lösung: 

https://connect.Microsoft.com/VisualStudio/feedback/details/819552/visual-studio-debugger-throws-accessviolationexception

5
gb2d

Dieses Problem hatte ich kürzlich, als ich den Entwicklungsserver für ein Projekt wechselte. Ich habe diesen Fehler in der Codezeile erhalten, in der ich eine neue OracleConnection-Variable deklariert habe.

Nachdem ich viele Dinge ausprobiert hatte, einschließlich der Installation von Hotfixes, habe ich versucht, die Referenzen Oracle.DataAccess und System.Data.OracleClient im Projekt zu ändern.

Wenn ein Projekt auf eine neue Maschine verschoben wird, sollten Sie alle in diesem Projekt hinzugefügten Referenzen erneuern.

5
deepakg_rao

Nachprüfbarer Code sollte den Speicher nicht beschädigen können, daher ist etwas nicht sicher. Verwenden Sie irgendwo unsicheren Code, beispielsweise bei der Pufferverarbeitung? Der Inhalt von PInvoke ist möglicherweise nicht unerheblich, da PInvoke einen Übergang zu nicht verwaltetem Code und damit verbundenem Marshalling beinhaltet.

Meine beste Empfehlung ist, an eine abgestürzte Instanz anzuschließen und WinDBG und SOS zu verwenden, um tiefer in das einzutauchen, was zum Zeitpunkt des Absturzes geschieht. Dies ist nicht für schwache Nerven gedacht, aber an diesem Punkt müssen Sie möglicherweise leistungsfähigere Werkzeuge ausfindig machen, um festzustellen, was genau schief geht.

3
Dan Bryant

Haben Sie versucht, DEP (Data Execution Prevention) für Ihre Anwendung zu deaktivieren?

3
alhazen

Es könnte Hardware sein. Es könnte etwas komplizierter sein, aber ich würde einen Stich dafür nehmen, dass der Threading-Code irgendwo irgendwo eine Sammlung (zum Beispiel ein Wörterbuch) nicht mit einem geeigneten Schloss schützt.

Welches Betriebssystem und Service Pack führen Sie aus?

3
Mitch Wheat

Ok, das könnte ziemlich nutzlos und einfach nur anekdotisch sein, aber ...

Diese Ausnahme wurde von einigen Twain32-Bibliotheken, die wir in meinem Projekt verwendeten, durchgängig ausgelöst, würde jedoch nur auf meinem Computer auftreten.

Ich habe viele Lösungsvorschläge im gesamten Internet ausprobiert, ohne Erfolg ... Bis ich mein Handy herausgezogen habe (es war über USB angeschlossen).

Und es hat funktioniert.

Es stellte sich heraus, dass die Twain32-Bibliotheken versucht haben, mein Telefon als Twain-kompatibles Gerät aufzulisten, und etwas, das dabei verursacht wurde, diese Ausnahme verursacht hat.

Stelle dir das vor...

3
almulo

Ich stand vor demselben Problem. Mein Code war eine .NET-DLL (AutoCAD-Erweiterung), die in AutoCAD 2012 ausgeführt wurde. Ich verwende auch Oracle.DataAccess, und mein Code löste während ExecuteNonQuery () dieselbe Ausnahme aus. Ich löste dieses Problem zum Glück, indem ich die .net-Version des verwendeten ODPs (dh 2.x von Oracle.DataAccess) änderte.

3
kmxr

Dieses Problem ist fast immer ein einfaches Problem. Der Code ist schlecht. Es sind selten die Werkzeuge, nur aus einer statistischen Analyse. Unzählige Millionen von Menschen verwenden täglich Visual Studio, und vielleicht verwenden einige Ihren Code - welcher Code wird besser getestet? Ich garantiere Ihnen, wenn dies ein Problem mit VS wäre, hätten wir es wahrscheinlich schon gefunden.

Die Aussage bedeutet, dass wenn Sie versuchen, auf Speicher zuzugreifen, der nicht Ihnen gehört, normalerweise, weil Sie es mit einem beschädigten Zeiger machen, der von einem anderen Ort stammt. Deshalb gibt es den Hinweis.

Bei Speicherbeschädigung befindet sich der Abruf des Fehlers selten in der Nähe der Hauptursache des Fehlers. Und die Effekte sind genau das, was Sie beschreiben, scheinbar zufällig. Sie müssen nur die üblichen Schuldigen betrachten, wie zum Beispiel:

  • nicht initialisierte Zeiger oder andere Werte.
  • mehr in einen Puffer schreiben als seine Größe.
  • ressourcen, die von Threads gemeinsam genutzt werden, die nicht durch Mutexe geschützt sind.

Ab einem solchen Problem rückwärts zu arbeiten, um die Hauptursache zu finden, ist unglaublich schwierig, da zwischen der Entstehung des Problems und der Erkennung des Problems so viel passieren konnte.

Meistens finde ich es einfacher, einen Blick auf das zu werfen, was ist (beispielsweise ein bestimmter Zeiger) ist, und dann eine manuelle statische Analyse des Codes durchzuführen, um festzustellen, was den Code beschädigt haben könnte, und nach den üblichen Übeltätern zu suchen, wie oben gezeigt. Aber auch das wird lange Ketten von Problemen nicht fangen.

Ich kenne mich mit VS nicht aus, um es zu wissen, aber Sie möchten vielleicht auch nach Möglichkeiten suchen, ein Memory-Tracking-Tool (wie valgrind für Linux) zu verwenden, um festzustellen, ob offensichtliche Probleme entdeckt werden.

2
paxdiablo

in meinem Fall war die Datei geöffnet und daher gesperrt. 

Ich habe es bekommen, als ich versuchte, eine Excel-Datei mit LinqToExcel zu laden, die ebenfalls in Excel geöffnet wurde. 

das ist alles, was ich tat

    var maps = from f in book.Worksheet<NavMapping>()
                select f;
    try {
        foreach (var m in maps)
            if (!string.IsNullOrEmpty(m.SSS_ID) && _mappings.ContainsKey(m.SSS_ID))
                _mappings.Add(m.SSS_ID, m.CDS_ID);
    } catch (AccessViolationException ex) {
        _logger.Error("mapping file error. most likely this file is locked or open. " + ex);
    }
2
Sonic Soul

ich hatte auch dieses Problem ... Ich führte verschiedene Lösungen zur gleichen Zeit mit Visual Studio aus, beim Schließen anderer Lösungen und Ausführen der Ziellösung funktionierte es problemlos ohne diesen Fehler.

1
ako

Ich habe den gleichen Fehler in einem Projekt erhalten, mit dem ich in VB.NET gearbeitet habe. Das Aktivieren des Anwendungsframeworks auf der Eigenschaftenseite hat es für mich gelöst.

1
Tony Raymond

Ich habe diesen Fehler erhalten, wenn Sie pinvoke für eine Methode verwenden, die einen Verweis auf eine StringBuilder enthält. Ich hatte den Standardkonstruktor verwendet, der anscheinend nur 16 Bytes zuweist. Windows hat versucht, mehr als 16 Bytes in den Puffer einzufügen und verursachte einen Pufferüberlauf.

Anstatt

StringBuilder windowText = new StringBuilder(); // Likely overflow of default capacity of 16

Verwenden Sie eine größere Kapazität:

StringBuilder windowText = new StringBuilder(3000);
1
Charlie

In einigen Fällen kann dies passieren, wenn:

obj = new obj();
...
obj.Dispose();  // <-----------------    Incorrect disposal causes it
obj.abc...
0
T.Todua

Meine Antwort hängt in hohem Maße von Ihrem Szenario ab. Es gab jedoch ein Problem beim Versuch, eine .NET-Anwendung für einen Client zu aktualisieren, der mehr als 10 Jahre alt war, damit er unter Windows 8.1 funktioniert. @Alhazens Antwort war für mich irgendwie im richtigen Rahmen. Die Anwendung war auf einen Drittanbieter angewiesen DLL = Der Client wollte nicht für die Aktualisierung bezahlen (Pegasus/Accusoft ImagXpress). Wir haben die Anwendung für .NET 4.5 neu ausgerichtet, aber bei jeder Ausführung der folgenden Zeile erhielten wir die AccessViolationException was unhandled-Nachricht:

UnlockPICImagXpress.PS_Unlock (1908228217,373714400,1341834561,28447);

Um das Problem zu beheben, mussten wir das folgende Postbuild-Ereignis zum Projekt hinzufügen:

call "$(DevEnvDir)..\tools\vsvars32.bat"
"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\AMD64\editbin.exe" /NXCOMPAT:NO "$(TargetPath)"

Dadurch wird explizit angegeben, dass die ausführbare Datei mit Data Execution Prevention nicht kompatibel ist. Für weitere Details siehe hier .

0
Barrie

In meinem Fall musste ich eine C/C++ - Bibliothek mit P/Invoke referenzieren, aber ich musste sicherstellen, dass der Speicher zuerst mit fixed für das Ausgabearray reserviert wurde:

[DllImport("my_c_func_lib.dll", CharSet = CharSet.Ansi)]
public static extern unsafe int my_c_func(double input1, double input2, double pinput3, double *outData);

    public unsafe double[] GetMyUnmanagedCodeValue(double input1, double input2, double input3)
    {
        double[] outData = new double[24];

        fixed (double* returnValue = outData)
        {
            my_c_func(input1, input2, pinput3, returnValue);
        }

        return outData;
    }

Einzelheiten finden Sie unter: https://www.c-sharpcorner.com/article/pointers-in-C-Sharp/

0
user8128167

Dieser Fehler wurde in VS1017 zufällig generiert, als versucht wurde, ein Projekt zu erstellen, das am Tag zuvor perfekt in Ordnung war. Beim Neustart des PCs wurde das Problem behoben (Ich habe auch den folgenden Befehl ausgeführt, nicht sicher, ob es erforderlich ist: netsh winsock reset)

0
Eternal21