Ошибки приложения 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 ответов:
Наконец-то нам удалось заполучить рабочую машину, демонстрирующую такое поведение, и с помощью ряда шагов по устранению неполадок, включая отправку файлов дампа в 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-недельной пробной версии, которую они дают.