2016-05-31 7 views
9

私はC#で作業していたアドオンの中に2つの異なる機能を持っています。最近(明らかに)SolidWorksは、これらの2つの機能の特定の部分に到達するとクラッシュしています(これ以上のことはありませんが、これまでに見つかったのは2つだけです)。デバッグでは、両方の関数が "Memory Access Violationエラー"。このエラーは、毎回アクティブな文書を閉じる行で発生し、時間の約95%が発生します。SolidWorks、Isldworks.CloseDocのメモリアクセス違反エラーを追跡する

ほとんどの場合、同じ部分にあります。 実行時間や開閉された部品の数に依存しないようです。 ファイルを閉じないと、エラーが発生しないようです。しかし、大規模なアセンブリを実行すると、それは独自の問題を提示します。 閉じる前に1秒の待機時間を追加すると、エラーの頻度が減るように見えます(エラーなしでアセンブリ全体を時折取得できます)。

私が主に気にしている機能を簡単に説明しています。 ;これは、アセンブリのトップレベルから、カスタムアセンブリをメインアセンブリおよびサブアセンブリから子に伝播するまで機能します。ですから、私は常に異なるアセンブリとパーツファイルを開いたり閉じたりしています。

以下のコードは、エラーを再現する最小限のものまでほとんど削除されています。エラーは59行目で発生します。これまでオンラインで見たIveから、これは追跡が難しいようです。どんな助けでも大歓迎です。

public void propagateProps(bool overwrite) 
    { 
     List<string> assemblies = new List<string>(); 
     string topAssem; 
     string compName = ""; 
     int i = 0; 
     int j = 0; 
     int errors = 0, warnings = 0; 
     int partType = 1; 
     swModel = iSwApp.ActiveDoc; 
     if (swModel == null) 
     { 
      MessageBox.Show("No assembly document open. Please open an assembly and try again.", "Avengers Assemble Error"); 
      return; 
     } 
     if (swModel.GetType() != 2) 
     { 
      MessageBox.Show("No assembly document open. Please open an assembly and try again.", "Avengers Assemble Error."); 
      return; 
     } 
     topAssem = swModel.GetPathName(); 
     assemblies.Add(swModel.GetPathName()); 
     swAssy = iSwApp.ActiveDoc; 
     while (i < assemblies.Count) 
     { 
      List<string> beenDone = new List<string>(); 
      iSwApp.OpenDoc(assemblies[i], 2); 
      swModel = iSwApp.ActivateDoc(assemblies[i]);     
      swAssy = iSwApp.ActiveDoc; 
      foreach (Component2 swComp in swAssy.GetComponents(true)) 
      { 
       partType = 1; 
       compName = swComp.GetPathName(); 
       if (compName.IndexOf(").SLD") > 0 || compName.IndexOf("REF") > 0) 
       { 
        continue; 
       } 
       if (Path.GetExtension(compName).ToUpper() == ".SLDASM") 
       { 
        partType = 2; 
        assemblies.Add(compName); 
       } 
       iSwApp.OpenDoc(compName, partType); 
       swModel = iSwApp.ActivateDoc(compName); 
       if (swModel == null) 
       { 
        continue; 
       } 


       #region things that might not be in 


      #endregion 


       boolstatus = swModel.Save3(5, errors, warnings); 
       System.Threading.Thread.Sleep(500); 
       iSwApp.CloseDoc(swModel.GetPathName()); 
      swPart = null; 
      swModel = null; 
      } 
      ++i; 
      System.Threading.Thread.Sleep(500); 
     } 


     return; 
    } 

更新:この質問を見た後、 What's causing the memory access violation?私は自分の関数で何の効果もないグローバル変数を使いこなそうとしました。しかし、私は、この問題を回避していると思われる部分をループするために、別の論理構造で自分の本質的なコードをラップすることができました。しかし、私は気分が最高だと感じ、将来この問題を回避できるようにしたいと考えています。

+0

誰も入力したことがありません。 – Nick

+1

あなたはC#でコードを書いています - あなたがPInvokesや安全でないブロックなどで作業している場合を除き、メモリアクセス例外を発生させることは不可能です。合理的な唯一の答えは、SolidWorksには妥当な入力をクラッシュさせる不合理な入力、または不合理な入力を検証していないためクラッシュさせるバグがあることです。あなたはどこにでもnullを渡していますか?オブジェクトを閉じた後にオブジェクトを使用しようとしていますか?非同期の操作を使用していますか?フックを提供していますか? – antiduh

+0

[OpenDoc](http://help.solidworks.com/2012/English/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.ISldWorks~OpenDoc.html)は推奨されていないようです。あなたが新しい方法を使用していない理由は何ですか?なぜOpenDocの戻り値を使用しないのですか? – antiduh

答えて

4

あなたはPInvokesや安全でないブロックなどで作業している場合を除き、メモリアクセスの例外を発生させることは不可能です。合理的な唯一の答えは、SolidWorksには妥当な入力をクラッシュさせる不合理な入力、または不合理な入力を検証していないためクラッシュさせるバグがあることです。

本当の修正は、SolidWorksに連絡してバグを再現させて修正することです。それを避けて、コードを分析して、バグや障害の共通のトリガーとなる相互作用を探すことができます。たとえば、入力のすべてを正しく検証していない可能性があります。暗黙のうちに受け入れる無効な値を指定している可能性があります。それはずっと後に壊れません。

誤ってnullを渡していてチェックしていなかった場合、後でそのnullからポインタを取得しようとするとメモリアクセス違反が発生する可能性があります。閉じた後にリソースを使用していて、そのような状態を検証していない場合は、ボンネットの下に古いポインタを使用してメモリアクセス違反を引き起こす可能性があります。

非同期操作で障害が発生している可能性があります。非同期操作を開始し、その操作に関連付けられたリソースを閉じると、その操作が後でバックグラウンドで進行すると、障害が発生する可能性があります。

返されたハンドルを使用している方法でメモリアクセス違反が発生している可能性があります。 OpenDocの戻り値を使用せず、代わりに他の方法で文書にアクセスしようとしています。 OpenDocの戻り値がガベージコレクションされるとどうなりますか?おそらく、SolidWorksが適切に参照カウントしていない可能性があります。したがって、戻り値がGC'dの場合、フードの下のハンドルは閉じられ、ゼロになります。それでもなお他の操作はそれが有効であると予想し、したがってメモリアクセス違反を引き起こす。

廃止予定のAPIを使用している可能性もあります。その場合は、テストやメンテナンスが行われないため、バグの可能性が高いSolidWorksでコードを実行している可能性があります。私はあなたがOpenDocメソッドを呼び出していることに気付きました。ドキュメントのリストは廃止予定です。代わりにOpenDoc6など推奨される方法を使用することを検討してください。

APIの実際の問題は壊れているか、壊れている入力に対しても十分に検証されていないため、これらの共通のAPI問題の原因を調査することが唯一の選択肢です。

+1

私が上で述べたように、OpenDoc6コールを使用することで実際に問題を引き起こしている可能性のある問題は、私の最後に問題を解決したようです。ありがとうございました! – Nick

関連する問題