2017-01-02 1 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하는 유일한 방법은 관리 코드가 수행해서는 안되는 throw new AccessViolationException()을 의도적으로 호출하는 것입니다. 특정 경우 예외는 관리되지 않는 컨텍스트에서 일부 DB 라이브러리에 의해 트리거됩니다. 이 경우 예외를 포착 할 수 없습니다.

AccessViolationException 시도/일반 언어 런타임에 의해 슬로우은 .NET Framework 4, AccessViolationException 예외로 시작 catch 블록

에 의해 처리되지 않는 : 다음은이 설명 MSDN에서 부분이다 catch 문을 공용 언어 런타임에 의해 예약 된 메모리 외부에서 예외가 발생하면 구조적 예외 처리기에서 문을 catch하십시오. 이러한 AccessViolationException 예외를 처리하려면 예외가 throw 된 메서드에 HandleProcessCorruptedStateExceptionsAttribute 특성을 적용해야합니다. 이 변경 사항은 AccessViolationException 사용자 코드에 의해 throw 된 예외에 영향을 미치지 않으며, 은 catch 문에 의해 계속 catch 될 수 있습니다. 다시 컴파일하려는 이전 버전의 .NET Framework에 대해 작성한 코드와 을 .NET Framework 4에서 수정하지 않고 실행하면 응용 프로그램의 구성 파일에 <legacyCorruptedStateExceptionsPolicy> 요소를 추가 할 수 있습니다. AppDomain.FirstChanceException 또는 AppDomain.UnhandledException 이벤트에 대한 처리기를 정의한 경우 예외에 대한 알림을받을 수도 있습니다.

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

내가 AV 예외를 잡기하거나 복구하는 방법을 알고하지 않는 한, 어셈블리에 HandleProcessCorruptedStateExceptionsAttribute을 적용하지 않는 것이 좋습니다 :

은 기본적으로 그것은 AV를 잡으려고 시도하는 코드가 작동하지 않을 것입니다 의미 예외, 어떤 경우에는 정확한 작업을 알지 못하기 때문에 당신이하지 않는 예외.

이제 원래 질문에 대답하십시오.이 예외에 대한 호출 스택을 분석하는 방법.예외가 관리되지 않기 때문에 VS에서 관리되지 않는 디버깅을 활성화하고이 예외가 트리거 될 때 관리되지 않는 호출 스택을 수집해야합니다.

+0

에 대한 답장을 보내 주셔서 감사합니다. –

+0

동생이 내가 업로드 한이 dmp 파일을 분석하도록 도와주세요. 나는 이것에 초보적이며 너에게 어떤 힌트라도 부탁 할 것이다. [drive.google.com/open?id=0BzWisplLq-PqMlhzaVdFNTJiZjg] –

관련 문제