2016-04-18 12 views
2

Derivate dieser Frage wurden sicherlich gefragt, aber ich habe noch eine finden, die meinem Fall entspricht.Versuch zu lesen oder zu schreiben, geschützter Speicher Ausnahme tritt ohne Debugging, aber nicht mit Debug

Ich habe eine Bibliothek erstellt, die eine C++ - Bibliothek von Drittanbietern einpackt und an einige interne Systeme liefert. Die erstellte Bibliothek verwendet C++/CLI, um Benutzern den Zugriff über C# zu ermöglichen. Die Bibliothek wird erstellt und kann mit unserem internen NuGet-Server mit kontinuierlicher Integration gestartet werden. Daher ist sie verfügbar.

Es gibt kein Problem mit dieser Bibliothek innerhalb einer anderen Anwendung/System beim Ausführen eines Programms mit "Start Debugging" (F5), aber wenn es mit "Start ohne Debugging" (Strg + F5) oder über eine ausführbare Datei ausgeführt wird Ausnahme wird wie folgt erhöht:

Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 

at TheirLib.func(Int32 , Int32 , Double* , Int32 , Int32* , Int32* , Double* , Int32 , TheirLibError*) 
at MyLib.Func(Int32 n, Int32 m, Double[] x, Int32 tdx, Int32[] svar, Int32[] sobs, Double[] corr, Int32 tdc) 
at SomeApplication.Program.Main(String[] args) in d:\SomeApplication\SomeApplication\Program.cs:line 67 

ich hier (https://connect.microsoft.com/VisualStudio/feedback/details/819552/visual-studio-debugger-throws-accessviolationexception) gelesen, dass es, dass man sein könnte, muss .NET 4.5.2, aber das alles änderte sich nicht. Ich dachte auch, dass es in meiner C++/CLI-Bibliothek einige Einstellungen geben könnte, mit denen ich dieses Problem umgehen könnte, aber ich konnte nichts finden und habe das Gefühl, überall nachgesehen zu haben. Ich habe auch den C++/CLI-Code betrachtet, der die pin_ptr-Objekte vorbereitet, die beim Aufruf der Third-Party-Bibliothek verwendet werden, aber alles sieht gut aus (siehe unten).

void MyLib::Func(int n, int m, array<double>^ x, int tdx, array<int>^ svar, array<int>^ sobs, 
    array<double>^ corr, int tdc) 
{ 
    // Setup input parameters 
    pin_ptr<double> xPtr = &(x[0]); 
    pin_ptr<int> svarPtr = &(svar[0]); 
    pin_ptr<int> sobsPtr = &(sobs[0]); 
    pin_ptr<double> corrPtr = &(corr[0]); 
    TheirLibError fail; 

    // Call their library's function 
    func(n, m, xPtr, tdx, svarPtr, sobsPtr, corrPtr, tdc, &fail); 
} 

Auch hier arbeitet die Bibliothek genau wie erwartet mit „Start Debugging“ und übergibt eine erschöpfende Reihe von Tests, aber ich kann einfach nicht verstehen, warum dies nicht allein funktionieren würde ... ich buchstäblich alles versuchen, dies werde zeigen Sie darauf, dass es funktioniert. Hilf mir SO, du bist meine einzige Hoffnung ...

+3

Warum die Downvotes? Wenn etwas in Bezug auf die Fragen/Problem nicht klar ist, oder es irgendwo eine Lösung gibt, würde ich lieber über sie als im Gegensatz zu erhalten nur Downvotes hören ... – grantathon

+0

Ich fürchte, Sie werden nicht viel Hilfe bekommen, der Fehler scheint in der Third-Party-Lib zu sein ... Haben Sie überprüft, ob die Arrays groß genug sind? Ich nehme an, einer der Parameter ist die Anzahl der Elemente. Haben Sie den Wert überprüft? Kann nicht viel mehr dort helfen:/ –

+0

@Lucas: Also vom Blick auf die MyLib :: Func, würdest du sagen, dass dies die pin_ptr Objekte richtig initialisiert? Siehst du etwas inkonsistentes von dem, was du normalerweise siehst? – grantathon

Antwort

1

Nach der Kontaktaufnahme mit der Bibliothek Besitzer war das Problem, dass TheirLibError wurde nicht ordnungsgemäß initialisiert, und die Zeiger in dieser Struktur enthalten wurden nicht richtig in der Bibliothek behandelt. Nach ordnungsgemäßer Initialisierung funktionierte alles wie erwartet.

Moral der Geschichte, erkundigen Sie sich mit dem Besitzer der Bibliothek, ob ihre Bibliothek Zeiger oder andere Zeiger Verhalten hält, wenn mit einer AccessViolationException angesprochen.