Ошибки приложения WPF и ремонт .Net Framework - PullRequest
11 голосов
/ 11 февраля 2012

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

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

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

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

Заключение : Поскольку это, кажется, решает проблему, когда больше ничего не происходит, кажется, что мы каким-то образом повреждаем библиотеку DLL GAC - либо с помощью кода, либо с помощью процедур загрузки / выключения на ПК.

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

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

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

Ответы [ 5 ]

2 голосов
/ 26 июля 2012

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

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

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

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

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

0 голосов
/ 02 апреля 2012

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

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

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

Вы можете присоединиться к уже запущенному процессу, но вы также можете запустить приложение из Visual Studio.

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

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

Удачи!

0 голосов
/ 21 февраля 2012

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

 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 голосов
/ 18 марта 2012

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

0 голосов
/ 18 февраля 2012

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

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

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

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

...