2017-01-02 7 views
0

C#WPFアプリケーションは定期的に実行されていますが、これは多くの場合、他のメモリが壊れていることを示しています。C#C#アプリケーションの呼び出しスタック情報を分析する方法データベースがアクセス例外と呼ばれ、メモリを読み書きしようとすると壊れます

これは私のコードです。当初私はいくつかの外部アプリが私のデータベースに干渉していると思ったので、DBが閉じられているか開いているかをチェックするためのコードを追加しました。しかし、エラーが他の何かにあるように見えて、これが私を狂ってしまう。

私はコールスタックをポストしています。スレッド17には、問題の発生原因に関するいくつかの事実があります。私は全体のダンプファイルを共有している私のドライブのための

リンクは、スレッド・ノー17 [https://drive.google.com/open?id=0BzWisplLq-PqMlhzaVdFNTJiZjg]

をチェックアウトしていないしてください、私は問題を見つける助けてください?私はこれに新しいです。ほとんど常にenter image description here

using (var context = Context.Create("C:\\XSR_BIB_V2\\XSR_BIB_V2_DATABASE.sdf", "", 4091)) 
{ 
    if (DbUpdateLoop.context.Database.Connection.State == System.Data.ConnectionState.Closed) 
               DbUpdateLoop.context.Database.Connection.Open(); 

      try 
       { 
      var data = DbUpdateLoop.context.EnergyPeakInfo_Tbl.Where(x => (my_startTime >= x.StartTime) && (my_stopTime <= x.StopTime)).FirstOrDefault(); 
       } 
      catch (AccessViolationException aV) 
      { 
      //exception is not caught here 
      } 
      } 
+0

@ChrisOがスタックを投稿しました。あなたが私に道を示すことができるなら、これは私を助けるかもしれません。 –

+0

あなたが投稿したダンプは、私にとって見た目が良くないと思っていません。どのように捕まえましたか?私はprocdumpの実行を提案し、例外のためにプロセスを監視し、遭遇したときにダンプを書き込ませるようにします。 'procmon -n 1000 -ma -e 1 'とすると、便利なダンプを手に入れることができます。 –

+1

あなたが投稿したコードはスクリーンショットのコードではありません。ダンプファイル全体を共有していない場合は、テキストファイルのみを共有しています。いずれのコマンドも、テキストファイル内の例外が実際にアクセス違反であることを確認するものはありません。要するに、この要求は意味をなさない。 –

答えて

2

AccessViolationExceptionは、アンマネージコードは、プロセスにマップされていないメモリを読み書きしようとしていたことを示します。マネージコードがこの例外をスローする唯一の方法は、意図的にthrow new AccessViolationException()を呼び出すことです。あなたの特定のケースでは、例外は、明らかに管理されていないコンテキストで、いくつかのDBライブラリによってトリガされます。この場合、例外をキャッチすることはできません。ここでは、これを説明するMSDNからのセクションです:

AccessViolationExceptionは、および.NET Framework 4以降で/ catchブロック

を試し、共通 言語ランタイムによってスローAccessViolationException例外はによって処理されません例外が共通言語ランタイムによって予約されている のメモリ外で発生した場合は、 構造化例外ハンドラ内のcatchステートメントを使用します。このような AccessViolationExceptionの例外を処理するには、例外がスローされる メソッドに HandleProcessCorruptedStateExceptionsAttribute属性を適用する必要があります。この変更は、ユーザーコードによってスローされた AccessViolationExceptionの例外に影響しません。 はcatchステートメントによって引き続き捕捉されます。再コンパイルする.NET Frameworkの 以前のバージョン用に作成されたコードで、 を.NET Framework 4で修正せずに実行する場合は、 <legacyCorruptedStateExceptionsPolicy>要素をアプリケーションの 構成ファイルに追加できます。 AppDomain.FirstChanceExceptionまたはAppDomain.UnhandledExceptionイベントのハンドラを定義している場合は、 例外の通知を受け取ることもできます。

基本的にはAVをキャッチしようとしているコードは動作しません意味:

try 
{ 
    ... code that throws AV exception 
} 
catch (AccessViolationException ex) 
{ 
    ... this will never be executed, exception will propagate to top level process handler 
} 

あなたから回復する方法を知っている限り、私は、AVの例外をキャッチしたり、アセンブリにHandleProcessCorruptedStateExceptionsAttributeを適用することはお勧めしません例外は、あなたが実際にどのような操作がこれを引き起こしたのかわからないため、あなたのケースではありません。

ここで、元の質問に答えよう:この例外のコールスタックを分析する方法。例外は管理されていないため、VSでアンマネージデバッグを有効にし、この例外がトリガされたときにアンマネージコールスタックを収集する必要があります。

+0

返信いただきありがとうございます。 –

+0

brother私はこのdmpファイルを分析して、私が新しくアップロードしたのを助けてください。私はこれに新しいですし、私はあなたからのヒントをお待ちしております[drive.google.com/open?id=0BzWisplLq-PqMlhzaVdFNTJiZjg] –

関連する問題