Почему моя программа windows умирает с замороженными (голубовато-серыми) формами или окнами? - PullRequest
1 голос
/ 26 октября 2011

Моя программа delphi (НЕ для .NET) в Windows 7, кажется, работает в течение нескольких дней подряд, и затем программа как бы зависает, когда все ее окна окрашены в голубовато-серый цвет, как будто ее окна отключены.Вы просто не можете больше контролировать программу, но должны завершить ее и снова запустить.Вам не нужно перезагружать саму систему.

Кто-нибудь испытывал это или что-то подобное?Если так, что вы сделали, чтобы решить или попытаться решить это?

Спасибо,

Ответы [ 3 ]

4 голосов
/ 27 октября 2011

Контекст вашего вопроса очень расплывчатый. У нас нет никакой информации о вашем приложении, даже о его дизайне и архитектуре.

Тем не менее, мои (универсальные) предложения следующие:

  • Если ваше приложение не многопоточное, выполните процесс в фоновых потоках, а затем оставьте основной поток готовым к обработке сообщений GDI;
  • Если ваше приложение является многопоточным, позаботьтесь о том, чтобы весь доступ к VCL из фоновых потоков осуществлялся посредством вызова Synchronize;
  • Если ваше приложение является многопоточным или использует таймеры, позаботьтесь о том, чтобы ни один метод не был повторным (в некоторых случаях вы можете прийти в состояние гонки );
  • Охотиться на любую утечку памяти;
  • Использовать подробный журнал выполнения программы, регистрировать все исключения Воскрес, чтобы угадать контекст зависания программы (он может использоваться на стороне клиента также для поиска условий гонки);
  • Загрузите замечательный бесплатный инструмент с именем ProcessExplorer (теперь размещенный в Microsoft) и проверьте состояние вашей замороженной программы: вы увидите подробную информацию о потоках, использовании процессора, памяти, сети, библиотеках, дескрипторы - это необходимо для любой серьезной отладки - отследите особенно утечки GDI утечки (количество из них должно оставаться стабильным);
  • Если вы еще не проверяли его, взгляните на глобальный системный журнал событий Windows: здесь может быть некоторая информация;
  • Возможно, сторонний компонент или библиотека ответственны за зависание процесса: попробуйте изолировать ту часть кода, которая может быть причиной этого зависания.

У меня приложение Delphi работает месяцами без проблем. Проблема явно в коде приложения, а не в архитектуре Delphi (его RTL и VCL очень стабильны).

2 голосов
/ 26 октября 2011

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

Самый простой способ отладки - запустить программу в отладчике, а когда она зависла, просто остановить ее и посмотреть, где она.

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

0 голосов
/ 27 октября 2011

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

Я использовал ProcessExplorer раньше (для просмотра стека), но для этого нужны символы отладки Microsoft. А с Delphi вы можете создать только файл .map. С map2dbg я мог бы преобразовать .map в .dbg, но это не всегда работает (примечание: .dbg устарело, более новые версии средств отладки Microsoft их больше не используют).

Итак, я сделал свой собственный инструмент :-) Он является частью инструмента «AsmProfiler Sampling»: http://code.google.com/p/asmprofiler/downloads/detailname=AsmProfiler_Sampling%20v1.0.7.13.zip Нажмите кнопку «Просмотр стека процесса» на первом экране . Затем выберите ваш процесс из списка и дважды щелкните по нему: http://code.google.com/p/asmprofiler/wiki/ProcessStackViewer

Теперь вы можете просматривать трассировку стека каждого потока. Если GUI не отвечает, основной поток зависает, поэтому проверьте первый поток. (примечание: иногда вы видите стек emtpy, потому что функция неправильно выровняла стек для вычислений и т. д., используйте алгоритм прямой трассировки трассировки, чтобы снова получить более полный стек (с большим количеством ложных срабатываний, потому что каждый указатель на стек, который является возможно функция показана!)).
Пожалуйста, опубликуйте стопку здесь, если вы не можете ее решить, чтобы мы могли взглянуть на нее.

Примечание: он использует модуль jclDebug.pas библиотеки JEDI, поэтому он может читать файлы .map и .jdbg (также файлы отладки .dbg и .pdb Windows-библиотек Windows), а также внутренние разделы JCLDEBUG (встроенный файл .jdbg). в одном .exe). Поэтому вы должны как минимум создать .exe с подробным (!) Файлом карты, см. «Параметры проекта» -> «Компилятор» -> «Связывание».

...