2012-02-11 4 views
11

배경 : Windows XP 및 Windows PosReady 2009 PC에서 실행되는 .Net 3.5 WPF "프리즘"기반 응용 프로그램이 있습니다. 이 응용 프로그램은 매일 밤 ("shutdown.exe"에 대한 C# 호출을 통해) 종료되고 아침에 Wake-on-LAN을 통해 새롭게 부팅되는 PC에서 실행됩니다. 응용 프로그램은 터치 기반 (ELO 터치 스크린 사용)이며 마우스 나 키보드가 연결되어 있지 않으며 사용자는 Windows에 액세스 할 수 없습니다.WPF 응용 프로그램 오류 및 .Net Framework 복구

: 우리는 두 가지 중 하나가 발생하는 문제를 산발적으로 봅니다. 응용 프로그램이 제대로로드되지 않는 것처럼 보이거나 빈 흰색 폼이 표시되거나 터치에 대한 응답이 중지됩니다. Google의 (log4net) 로그를 살펴보면 두 가지 경우에서 터치 이벤트를 처리하고 로그 아웃하고 있음을 알 수 있습니다. 종종 이것은 뷰를 전환 할 때 발생하는 것으로 보이며 Prism RegionManager가 제거하고 뷰를 적절하게 추가하는 로그에서도 볼 수 있습니다.

문제 해결 : 응용 프로그램이 Clonezilla 적용 이미지를 사용하여 약 ~ 100 PC를에 실행되고 이 산발적으로 발생합니다. 모든 PC에서 그런 일이 일어나지 않고 기록 된 예외 나 이벤트 표시기에 문제가 있음을 나타내지 않으므로 PC 및 OS 수준의 더 많은 수정이 필요합니다. 특히 우리는 단기간에 성공적으로 응용 프로그램과 PC를 다시 시작하려고 시도했습니다. 즉, 이러한 응용 프로그램이 다시 시작된 후에 응용 프로그램이 제대로 작동하지 않는 경우가 종종 있습니다. 우리는 또한 응용 프로그램이 어떻게 든 손상된 것으로 간주하고 성공적으로 제거하고 재설치했다고 가정합니다.

유일한 문제는 제공된 .Net 3.5 SP1 설치 관리자 패키지를 사용하여 .Net 프레임 워크를 복구하는 것입니다.

결론 : - 중 코드 또는 PC의 부팅/종료 절차를 통해이 이후 은 우리가 어떻게 든 GAC'd 프레임 워크 DLL을 손상되어 나타납니다, 다른 아무것도하지 않을 때 문제를 해결하는 것 같다.

질문 : 이 질문의 번호로 연결 : 우리가 더 문제의 원인을 식별 할 수있는 방법에

  • 어떤 아이디어?
  • 이 문제를 방지하기 위해 우리가 할 수있는 것에 대한 아이디어가 있습니까?
  • 기본 이슈에 대한 아이디어가 있습니까?

도움 주셔서 감사합니다.

+0

말하기 어렵다. 어떤 멀티 쓰레드가 진행되고 있습니까? GUI 스레드가 아닌 다른 이벤트가 발생 했습니까? – stmax

+0

주어진 시간에 상당히 다른 스레드가 있습니다.주로 BackgroundWorker 객체로 만들어 지지만, 일부는 ThreadStart를 사용하여 명시 적으로 만들어진 Thread 객체입니다. 작업자는 일반적으로 수명이 짧으며 (작성, 실행, 파괴) 스레드는 일반적으로 장기간 실행됩니다 (응용 프로그램 수명 동안 시작됨). 프리즘 집합 이벤트는 GUI 스레드에서 발생합니다. –

+0

이 기계에는 어떤 종류의 솔리드 스테이트 드라이브 하드웨어가 있습니까? 아니면 모두 저렴한 하드 드라이브로 실행되고 있습니까? 아야. –

답변

2

우리는 마침내이 동작을 나타내는 프로덕션 컴퓨터를 확보 할 수 있었으며 Microsoft에 덤프 파일을 보내지 만 문제를 해결할 수있었습니다.

WPF 글꼴 캐싱 Windows 서비스가 간혹 손상된 상태가되어 간단한 캐시 요청이 무기한 차단되는 경우가있었습니다. 이 행태로 인해 위에서 설명한 모든 동작이 WPF 응용 프로그램에서 발생했습니다.

간단한 해결책 : 서비스를 중지하고 비활성화하십시오. 서비스를 사용 중지하고 PC를 재부팅 한 후에는 서비스가 더 이상 사용되지 않으며 이러한 문제는 보이지 않습니다. 이론적으로 이는 애플리케이션로드 시간이 길어 지지만 부정적인 영향은 전혀 없습니다.

서비스의 버전은 3.0.0.0과 4.0.0.0의 두 가지입니다. 응용 프로그램이 .Net 3.0 또는 3.5를 타겟팅하는 경우 3 서비스를 사용 중지해야하며 4.0 이상을 타겟팅하는 경우 4 서비스를 사용 중지해야합니다.

귀하의 의견과 제안에 감사드립니다.

0

터치 스크린을 연결할 때 WPF 응용 프로그램을 사용하여 사용자에게 상기시켜주는 문제가있었습니다. 이것은 .Net의 자동화 프레임 워크에있는 버그 때문이었습니다. 이로 인해 응용 프로그램이 매우 느려지거나 GUI 스레드가 완전히 멈추게되었습니다. http://social.msdn.microsoft.com/Forums/en-IE/windowsaccessibilityandautomation/thread/6c4465e2-207c-4277-a67f-e0f55eff0110

해결 방법은 하나가 주기적으로 우리를 위해 일을 자동화 이벤트 리스너를 제거하는 위 스레드에서 제안 :

당신은이 문제에 대한 자세한 내용을보실 수 있습니다.

이것은 실제 답변이 아니지만 충분한 담당자가 없으므로 사용 하시겠습니까?(아마도) 주석 함수를 사용할 수 없습니다 :)

+0

여기에 해당한다고 생각하지 않지만 의견을 보내 주셔서 감사합니다. 우리는 자동화를 고소하거나 성능 문제를 보지 않고 있으며, 재시작으로 장기간 복구 할 수는 없습니다. –

0

글로벌 오류 캐치를 시도하고 생성 된 내용을 확인하십시오.

public partial class App : Application 
    { 
     [STAThread] 
     public static void Main() 
     { 
       var application = new App(); 

       application.DispatcherUnhandledException += 
        new DispatcherUnhandledExceptionEventHandler(application_DispatcherUnhandledException); 

       application.InitializeComponent(); 
       application.Run(); 
     } 

     static void application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
     { 
      LogAndClose("Global exception: " + e.Exception.ToString()); 
     } 

     public static void Log(string text) 
     { 
      try 
      { 
       System.IO.File.AppendAllText(Environment.CurrentDirectory + "\\Log.txt", 
        "[" + DateTime.Now.ToString("MM/dd/yy HH:mm:ss") + "] " + text + "\r\n"); 
      } 
      catch { } 
     } 

     public static void LogAndClose(string text) 
     { 
      Log(text); 

      try 
      { 
       Application.Current.Shutdown(); 
      } 
      catch { } 
     } 
    } 
+0

Dispatcher 및 App 도메인 처리되지 않은 예외에 대한 처리기가 첫날부터 제 위치에 있었으며 몇 차례 실제로 처리되었습니다. 여기는 운이 없다. 가치가있는 부분에 대해서는 Application.Current.DispatcherUnhandledException 및 AppDomain.CurrentDomain.UnhandledException에 리스너를 등록합니다. –

-2

메모리 누수가 있는지 확인하려면 ANTS profiler을 사용해보세요. 그들이 준 2 주 평가판으로 쉽게 찾을 수 있습니다.

+0

어떻게 메모리 누수가 발생합니까? – svick

+0

시스템의 클린 부팅 직후 문제가 반복 될 수 있으므로 메모리 누수가 아닌 것 같습니다. –

0

프로덕션 시스템을 원격 디버깅 해 보셨습니까? 원격 디버깅에 필요한 것은

은 다음과 같습니다 개발 및 생산 시스템

  • 사이

    • 배포 MSVCMON.EXE
    • 네트워크 연결 코드의 로컬 및 원격 버전이 동기화되어 있는지 확인합니다. 또한 dev 머신에서 빌드 할 수 있으며 xcopy는 원격 시스템에 디버그 빌드를 배포합니다. 순수한 .net 코드라면 쉽게 사용할 수 있습니다. 또한 C++ 코드가있는 경우 C++ dll의 디버그 버전이 프로덕션 시스템에 있는지 확인해야합니다. 또는 릴리스 버전을 빌드하고 원격 디버그합니다.
    • 연결에 사용되는 사용자 계정을 설정하십시오. 이것은 실제로 조금 까다 롭습니다. Google remote debugging credentials 몇 가지 팁.
    • 모든 방화벽을 비활성화하는 것을 잊지 마세요!

    이미 실행중인 프로세스에 연결할 수 있지만 Visual Studio 내에서 앱을 시작할 수도 있습니다.

    개발 시스템이 프로덕션 시스템과 멀리 떨어져 있으면 랩톱과 원격 데스크톱을 사용하여 개발자 스튜디오를 프로덕션 시스템으로 가져옵니다. 나는 이것을 일상적으로한다. 두 사람 사이의 거리가 5m라도 짜증나게합니다.

    관심이 있거나 연결 설정에 문제가있는 경우이를 상세히 설명 할 수 있습니다.

    행운을 빈다.

  • 관련 문제