2011-02-27 3 views
26

우리의 응용 프로그램은 이상한 치명적인 System.AccessViolationException을 경험합니다. 예외를 로그하기 위해 AppDomain.CurrentDomain.UnhandledException 이벤트를 구성 했으므로이를 볼 수 있습니다.System.AccessViolationException의 원인을 찾으십시오.

Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.Run(Form mainForm) 
    at Bootstrap.Run() in e:\build-dir\src\Bootstrap.cs:line 25 

자체가 메시지 보다 자세한 정보를 포함하지 않는 것 예외는 "보호 된 메모리를 읽거나 쓰려고했습니다. 이것은 다른 메모리가 손상되었음을 나타냅니다 종종 있습니다."

  • 이제 문제의 원인을 찾기 위해 어떤 단계를 밟을 수 있습니까?
  • 충돌을 일으킨 잘못된 주소 또는 포인터 값을 확인하는 방법이 있습니까?
  • 문제의 원인이 된 네이티브 라이브러리 코드를 찾을 수 있습니까?
  • 더 많은 디버깅/추적 기능을 사용할 수 있습니까?

  • 이이 윈폼의 API의 이전이 아닌 스레드 사용으로 인해 발생 될 수 있습니다 UPDATE?
+1

충분한 기호를 제공하는로드 또한, 당신이 첨부 된 디버거이 실행 시도 되세요 (짧은 DB-INT32 또는 NVARCHAR 긴 (10)에 대한 긴 전달) 유용한 콜 스택? –

답변

5

발생하는 것은 "프로그램에 문제가 발생하여 종료됩니다."는 점을 제외하고는 OS가 아닌 .NET 런타임에 의해 캐치됩니다.

스택 추적을 보면 코드에 의해 트리거되는 것이 아니므로 사용중인 라이브러리 또는 사용자 정의 컨트롤에 의해 생성 된 작업자 스레드에서 발생한다고 생각하게 만듭니다.

이런 식으로 추적하는 유일한 방법은 디버거에서 네이티브 라이브러리를 실행하는 것입니다. 그러면 디버거에서 CLR 계층에 도달하기 전에 액세스 위반을 트래핑해야합니다. 이것은 쉽거나 어렵습니다.

네이티브 코드가 자신의 프로젝트 인 경우이를 설정하는 가장 쉬운 방법은 .NET 프로젝트와 C++ 프로젝트를 동일한 솔루션에 배치하고 .NET 프로젝트가 C++ 프로젝트를 참조하는지 확인하는 것입니다 . 환경에 대한 자세한 내용을 게시하면보다 구체적인 조언을 드릴 수 있습니다.

+1

이것은 작업자 스레드가 아니며 기본 UI 스레드에서 종료됩니다. 참고 Application.Run() –

+1

한스 주석과 동의하십시오. .NET Reflector : Application.Run()이 AccessViolationException을 발생 시키지만 사용자의 컴퓨터에서 매우 가끔보고됩니다. 이유는 알 수 없습니다. 매우 드문 일이며 집에서 본 적이 없으므로 디버깅을 할 수 없었습니다. 어떤 잘못된 정보가 있다는 것을 확실하게 알기 때문에 적어도 유용한 정보의 방향으로 사용자를 안내 할 수는 있지만 아, 지금까지는 거부되었습니다. –

3

네이티브 디스패치 메신저의 MSG 매개 변수에서 스택 추적이 잘못된 데이터를 가리 킵니다. Microsoft에서 기호를로드하고 해당 스택 추적의 매개 변수를 확인해 보았습니다.

당신이 어떤 사건에 연결했는지 알지 못한다면, 정확히 어떤 문제인지 판단하기가 어려울 것입니다.

2

@BartRead와 비슷한 문제가 있었지만 일관되게 발생했습니다. 나를 위해, 일부 CLI 코드는 간단한 Windows 양식 응용 프로그램에서 제대로 작동하지만, larager 플러그인 생태계 (다중 스레드)에 넣을 때 Application.Run 또는 Application.DoEvents로 펌핑해야하는 메시지가 있습니다. 펌핑되는 코드에 액세스 할 수 있다면 기능을 유지하면서 점점 더 많은 코드 조각을 주석 처리하는 것이 가장 좋습니다. 그것은 GC가 아니었다 : :: Alloc'd 콜백/대리인 및 고정 된 동안 여전히 참조 된 또는 메모리에 곧바로 주위에 이동되었습니다 컬렉션에 대 한 플래그.

GC Alloc을 사용하는 경우 반드시 자신을 청소하십시오!

1

ADO를 사용하여 저장 프로 시저를 실행할 때이 문제가 발생했습니다. 이 오류의 원인은 두 가지입니다.

  1. 연결 문자열이 잘못되었습니다.
  2. 매개 변수 유형 미스 매치는
관련 문제