Ошибки приложения WPF and.Net ремонт каркаса


Фон: У меня есть приложение на базе .Net 3.5 WPF "Prism", работающее на ПК с Windows XP и Windows PosReady 2009. Приложение работает на компьютерах, которые выключаются каждую ночь (через C# вызов " shutdown.exe") и загружается свежим утром (через Wake-on-LAN). Приложение является сенсорным (с использованием сенсорных экранов ELO), к нему не подключены мыши или клавиатуры, а пользователи не имеют доступа к Windows.

Выпуск : Мы спорадически видим проблемы, когда происходит одно из двух; либо приложение не загружается правильно, и мы видим пустую белую форму, либо оно перестает реагировать на прикосновение. Из наших журналов (log4net) мы видим, что мы все еще обрабатываем события касания и регистрируем их в обоих случаях. Часто это, кажется, происходит при переключении представлений, и мы также видим в журналах, где Prism RegionManager удаляет и добавляет представления соответствующим образом.

Устранение неполадок : Приложение работает на приблизительно ~ 100 ПК с использованием изображений применяют при Клонезилле и это происходит лишь эпизодически. Поскольку это происходит не на всех компьютерах, и нет никаких исключений, зарегистрированных или что-либо указывающее на проблему в окне просмотра событий, мы прибегли к большему количеству исправлений на уровне ПК и ОС. В частности, мы попытались перезапустить приложение и ПК с временным краткосрочным успехом-это означает, что иногда приложение будет функционировать правильно после этих перезапусков, но только в течение нескольких часов максимум. Мы также работали в предположении, что приложение каким-то образом было повреждено, и мы удалили и переустановили его, но безуспешно.

Единственное, что, по-видимому, решает проблему, - это восстановление .Net framework с помощью предоставленного пакета установки .Net 3.5 SP1.

Заключение : Поскольку это, кажется, решает проблему, когда ничто другое не делает, кажется, что мы каким-то образом повреждаем библиотеку dll gac'D framework-либо с помощью кода, либо с помощью процедур загрузки / выключения на ПЕРСОНАЛЬНЫЙ КОМПЬЮТЕР.

Вопросы : Это приводит к ряду вопросов:

  • Есть ли какие-либо идеи о том, как мы можем далее определить источник проблемы?
  • Есть идеи, что мы можем сделать, чтобы предотвратить эту проблему?
  • есть какие-нибудь идеи по поводу того, что может лежать в основе проблемы?

Спасибо за любую помощь.

5 11

5 ответов:

Наконец-то нам удалось заполучить рабочую машину, демонстрирующую такое поведение, и с помощью ряда шагов по устранению неполадок, включая отправку файлов дампа в Microsoft, проблема была обнаружена.

Служба Windows кэширования шрифтов WPF иногда переходила в поврежденное состояние, в результате чего простой запрос кэша блокировался на неопределенный срок. Это зависание вызвало все действия, описанные выше в нашем приложении WPF.

Простое решение: остановить и отключить службу. После отключения службы и перезагрузки компьютера служба больше не используется, и мы не видим никаких из этих проблем. Теоретически это приводит к увеличению времени загрузки приложения, но мы не видим никакого негативного воздействия.

Обратите внимание, что существует две версии сервиса: 3.0.0.0 и 4.0.0.0. Если ваше приложение ориентировано на .Net 3.0 или 3.5, вам нужно отключить службу 3, а если таргетинг 4.0+, вам нужно отключить службу 4.

Спасибо всем за ваши комментарии и предложения.

У нас были проблемы с напоминанием о ваших с нашим приложением WPF при подключении сенсорных экранов. Это произошло из-за ошибки в платформе автоматизации в .Net. это привело к тому, что наше приложение либо стало очень медленным, либо полностью зависло в графическом интерфейсе.

Вы можете прочитать больше об этой проблеме по адресу: http://social.msdn.microsoft.com/Forums/en-IE/windowsaccessibilityandautomation/thread/6c4465e2-207c-4277-a67f-e0f55eff0110

Обходной путь, предложенный в потоке выше, где один удаляет любые слушатели события автоматизации, периодически работавшие на нас.

Это не настоящий ответ, но так как у меня недостаточно репутации? (Я думаю) я не могу использовать функцию комментариев:)

Попробуйте поймать глобальную ошибку и посмотрите, что она производит.

 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 { }
        }
    }

Вы пробовали удаленную отладку производственной системы?

Что вам нужно для удаленной отладки:

  • развертывание msvcmon.exe
  • сетевое соединение между вашей разработкой и производственной системой
  • Убедитесь, что локальная и удаленная версии кода синхронизированы. Вы также можете строить на своей машине разработки, а xcopy развернуть отладочную сборку на удаленной машине. Если это чистый .net-код, то это легко. Если у вас также есть код C++, вы должны убедиться, что отладочные версии библиотеки DLL C++ находятся на рабочей машине. Или создайте версию выпуска и удаленно отладьте ее.
  • настройка учетной записи пользователя, используемой для подключения. Это на самом деле немного сложно. Google remote debugging credentials для нескольких советов.
  • Не забудьте отключить все брандмауэры!

Можно подключиться к уже запущенному процессу, но также можно запустить приложение из visual studio.

Если ваша система разработки расположена далеко от производственная система, используйте ноутбук и удаленный рабочий стол, чтобы перенести студию разработчика в производственную систему. Я делаю это регулярно. Даже пятиметровое расстояние между ними раздражает.

Я могу подробнее рассказать об этом, если есть интерес, или если у вас возникнут проблемы с настройкой соединения.

Удачи!

Попробуйте использоватьAnts profiler , чтобы узнать, есть ли у вас утечка памяти. Вы можете легко узнать это с помощью только 2-недельной пробной версии, которую они дают.