2012-06-08 1 views
1

우리는 WPF 및 Entity Framework를 기반으로 실행되는 큰 비즈니스 응용 프로그램을 보유하고 있습니다. 문제는 지난 2 주 동안 문제가 발생하여 소스를 식별 할 수 없다는 것입니다.예외 (예외적으로 C# WPF가 발생 함)에서 자세한 정보를 얻으려면 어떻게해야합니까?

예외는 DispatcherUnhandledException에 의해 갇혀되고 있으며, 우리는 (이메일을 통해) 예외에서 점점 정보가 이것이다 :

mscorlib: Value cannot be null. 
    at System.Threading.Monitor.ReliableEnter(Object obj, Boolean& lockTaken) 
    at System.Threading.Monitor.Enter(Object obj, Boolean& lockTaken) 
    at System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString) 
    at System.Data.EntityClient.EntityConnection.Dispose(Boolean disposing) 
    at System.ComponentModel.Component.Finalize() 

예외가 발생되고있다 "무작위"4 또는 5 번 하루 만 우리가 가진 20 명 이상의 사용자 중 하나로부터 우리는 문제를 알아낼 수 없습니다!. 스택 추적은 많은 정보를 제공하지 않으며 우리는 문제를 재현 할 수 없습니다.

나는 이것이 스레드에서 발생한다고 가정하지만, BackgroundWorkers와 비동기적인 것들을 많이 가지고 있기 때문에 예외를 일으키는 스레드를 식별 할 수는 없다!

그렇다면 어떻게 예외에 대한 자세한 정보를 얻을 수 있습니까 ??


편집 :

어떤 InnerExceptions 없습니다.

또한 예외는 예를 들어 11:41, 11:46, 11:51과 같이 분과 시간 간격으로 발생합니다. 그런 다음 18:03, 18:07, 18:11까지 실행됩니다. 예외는 발생하지 않습니다. 이 분 간격이 발생하는 순간도 무작위이며 서버 또는 네트워크의 부하와 관련이 없습니다.

+3

이메일을 통해 전달되지 않는 'InnerException'이 있습니까? –

+0

아니요, 잡힌 모든 예외가있는 경우 InnerExceptions와 함께 전송됩니다. –

+0

프레임 워크의 일부 콜백에 의해 숨겨진 코드 어딘가에 예외가있을 수 있습니다.예외를 기록한 다음 catch하는 catch 절을 추가하십시오. WPF와의 접촉 지점에서 다시 돌아옵니다 (예 : VM 설정자, 명령 구현). 또한 가능한 경우 해당 클라이언트에게 해당 PDB를 보내고 원격으로 디버깅을 시도하십시오 (Visual Studio 원격 디버거 사용). –

답변

3

가비지 수집 스레드의 일부로 발생하는 것 같습니다. 스택 맨 아래에있는 Finalize 호출은 힌트이며 EntityConnection.Dispose (false);가 호출됩니다.

문제의 성격은 비 결정적입니다. 현재 상황에서 뭔가 바뀌었을 수 있습니다.

파이널 라이저에서는 다른 관리 대상 개체에 액세스하는 것이 실제로 안전하지 않습니다. ChangeConnectionString은 아마도 관리 객체를 잠금으로 사용하려고 시도하는 것처럼 보입니다. 그리고 GC 스레드에서 객체가 이미 정리 된 경우가 있습니다. 아마도 EntityConnection의 버그 일 것입니다.

Finalizer가 실행되도록하기보다는 구성 요소에서 Dispose를 호출하여이를 피할 수 있어야합니다 (블럭을 사용하여 둘러싸면 Finalizer가이를 보장 할 수 있습니다). 그러나 호출 스택을 사용하면 문제의 원인이되는 구성 요소의 특성에 대해 많이 말하기 어렵습니다.

로컬 복제본을 얻으려면 Finalize (예 : ~ MyComponent())를 대체하는 클래스로 EntityConnections에 액세스하는 Component 객체를 서브 클래 싱하고 예외를 throw합니다. 그렇게하면 GC가 이러한 객체를 정리하면 충돌이 발생합니다.

+0

모든 EF 연결에서'using' 절이 있습니다. 지금 원격 디버깅을하고 있는데, 전에는 사용하지 않았고 유망 해 보입니다. 귀하의 답변에 감사드립니다. 나는이 스레드를 사용할 수있는 경우 더 많은 정보로 업데이트 할 것이다. –

1

"ReliableEnter 값을 null로 설정할 수 없습니다."오류는 null로 설정된 개체를 잠그려고한다는 것을 의미합니다.

개체가 null로 설정되는 위치를 찾습니다.

관련 문제