Solidworks, das einen Speicherzugriffsverletzungsfehler bei Isldworks.CloseDoc ausfindig macht

9

Ich habe zwei verschiedene Funktionen in einem Addon, an dem ich in C # gearbeitet habe. Kürzlich (scheinbar) stürzte Solidworks ab, als es zu bestimmten Teilen dieser beiden Funktionen kam (möglicherweise mehr, aber das sind die einzigen beiden, die ich bisher gefunden habe.) Beide Funktionen geben mir beim Debuggen eine "Speicherzugriffsverletzung" Error". Dieser Fehler tritt jedes Mal in der Zeile auf, in der ich das aktive Dokument schließe, und tritt ungefähr in 95% der Fälle auf.

Es ist fast immer am selben Teil. Es scheint unabhängig von der Laufzeit oder Anzahl der Teile zu sein, die geöffnet und geschlossen wurden. Wenn ich die Dateien nicht schließe, scheint mir der Fehler nicht zu kommen. Aber wenn man eine große Baugruppe ausführt, hat das eigene Probleme. Das Hinzufügen einer Wartezeit von 1s vor dem Schließen scheint die Häufigkeit des Fehlers zu reduzieren (wie in, kann ich gelegentlich die gesamte Assembly ohne den Fehler durchgehen)

Eine kurze Erklärung dessen, worum es mir in erster Linie geht, mache ich; Es wird von der obersten Ebene einer Baugruppe aus ausgeführt, wobei die benutzerdefinierten Eigenschaften der Hauptbaugruppe und der Unterbaugruppen in ihre untergeordneten Elemente übernommen werden. So öffne und schließe ich ständig verschiedene Montage- und Teiledateien.

Der folgende Code wurde auf das Minimum reduziert, das den Fehler repliziert. Der Fehler tritt in Zeile 59 auf. Von dem, was ich bisher online gesehen habe, scheint es, als ob diese schwer zu finden sind. Jede Hilfe wird sehr geschätzt.

%Vor%

Update: Nachdem Sie diese Frage gesehen haben; Was verursacht die Speicherzugriffsverletzung? Ich habe versucht, mit einigen zu tun Globale Variablen nutze ich in meinen Funktionen wirkungslos. Ich habe es jedoch geschafft, meinen wesentlichen Code in eine andere logische Struktur zu bringen, um Teile durchzulaufen, die dieses Problem zu vermeiden scheinen. Aber ich denke, dass das ein Pflaster ist und möchte dieses Problem in Zukunft vermeiden können.

    
Nick 31.05.2016, 12:33
quelle

1 Antwort

4

Sie schreiben Code in C # - es sei denn, Sie arbeiten mit PInvokes, unsicheren Blöcken oder ähnlichem, es sollte unmöglich sein, Speicherzugriffsausnahmen zu verursachen. Die einzige vernünftige Antwort ist, dass SolidWorks einen Fehler hat, der entweder zu einem Absturz führt, wenn er vernünftige Eingaben macht, oder zum Absturz führt, weil er keine sinnvollen Eingaben überprüft.

Die eigentliche Lösung wäre, SolidWorks zu kontaktieren, damit der Fehler reproduziert und behoben wird. Abgesehen davon könnten wir Ihren Code analysieren, um nach Interaktionen zu suchen, die häufige Auslöser von Bugs und Fehlern sind. Zum Beispiel überprüfen sie möglicherweise nicht alle ihre Eingaben richtig - Sie könnten ungültige Werte angeben, die sie stillschweigend akzeptieren; Es bricht erst viel später.

Wenn Sie versehentlich null übergeben haben und sie nicht überprüft haben, kann dies zu einem Speicherzugriffsverstoß führen, wenn Sie später versuchen, einen Zeiger von dieser Null zu nehmen. Wenn Sie nach dem Schließen Ressourcen verwenden und diese nicht für eine solche Bedingung validiert haben, verwenden sie unter Umständen einen veralteten Zeiger, der ebenfalls eine Speicherzugriffsverletzung verursacht.

In anderen Situationen können asynchrone Operationen den Fehler verursachen - wenn Sie eine asynchrone Operation starten und dann die mit dieser Operation verknüpfte Ressource schließen, kann diese später, wenn diese Operation im Hintergrund abläuft, zu Fehlern führen.

Es ist möglich, dass die Art, wie Sie die an Sie zurückgegebenen Handles verwenden, zu Verletzungen des Speicherzugriffs führt. Ich habe festgestellt, dass Sie den Rückgabewert von OpenDoc nicht verwenden und stattdessen versuchen, auf andere Weise auf Dokumente zuzugreifen. Was passiert, wenn der Rückgabewert von OpenDoc Müll gesammelt wird? Vielleicht ist SolidWorks nicht korrekt Referenzzählung, und wenn der Rückgabewert GC'd ist, wird der Griff unter der Haube geschlossen und nulled; noch andere Operationen erwarten immer noch, dass es gültig ist und daher Speicherzugriffsverletzungen verursacht.

Es ist auch möglich, dass Sie die veraltete API verwenden. Wenn dies der Fall ist, können Sie in SolidWorks Code ausführen, der eine höhere Wahrscheinlichkeit hat, fehlerhaft zu sein, da er nicht mehr getestet oder gewartet wird. Ich habe festgestellt, dass Sie die aufrufen OpenDoc Methode, die in ihrer Dokumentation als veraltet aufgelistet wird. Erwägen Sie stattdessen, die empfohlenen Methoden zu verwenden, z. B. OpenDoc6 .

Abgesehen von der Behebung des eigentlichen Problems mit der API, die entweder kaputt ist oder nicht ausreichend gegen fehlerhafte Eingaben validiert wird, besteht die einzige Möglichkeit darin, diese Quellen allgemeiner API-Probleme zu untersuchen.

    
antiduh 11.07.2016, 15:46
quelle

Tags und Links