Приложение зависает при выходе - как отлаживать? - PullRequest
1 голос
/ 08 ноября 2010

У нас есть приложение, созданное хостом (exe) и множеством модулей (dll), содержащих графический интерфейс и т. Д. Иногда приложение зависает при завершении работы. В основном это происходит во время тестирования через TestComplete. Мы не можем воспроизвести поведение во время отладки.

Как мы можем узнать, почему приложение зависает?

Я бы предположил, что это связано с темами, но я точно не знаю.

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

Ответы [ 5 ]

9 голосов
/ 08 ноября 2010

Я думаю, что старые добрые журналы помогут вам. Добавьте некоторые записи в каждую единицу finalization, добавьте такую ​​запись в деструкторы глобальных данных (соединение с базой данных, глобальная конфигурация и т. Д.). Конечно, не уничтожайте объект логгера.

Если ваше приложение является многопоточным, добавьте в рабочие потоки некоторые записи, такие как запись «[date] thread [name of class] working», и записывайте его каждые несколько секунд (вы можете использовать режим отладки). Также добавьте ведение журнала, когда поток обнаруживает, что он должен завершиться.

Также используйте некоторые системные утилиты, такие как ProcessMonitor, Handles, Process Explorer (все от Sysinternals / Microsoft). Мониторинг чтения / записи диска, количество обращений, использование памяти, сетевые подключения. Может быть, ваше приложение выводит некоторые большие структуры на диск при выходе? Может быть, он выделил много памяти и должен освободить его?

5 голосов
/ 08 ноября 2010

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

3 голосов
/ 08 ноября 2010

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

0 голосов
/ 08 ноября 2010

Если ваше приложение работает под Windows 7 и в DLL запущены потоки, вы должны закрыть / прекратить все запущенные потоки DLL перед закрытием основной формы исполняемого файла.

Удачи

0 голосов
/ 08 ноября 2010

Если вы используете много компонентов графического интерфейса в DLL и / или выполняете много многопоточности, вам сначала нужно выяснить, какая DLL или нить вызывает проблему. Или, может быть, это сочетание обоих. По сути, вы должны создавать события журнала для каждой DLL и потока, который загружается / запускается. Попытайтесь получить ситуацию, когда у вас есть минимум DLL и потоков, загруженных для генерации зависания. Затем вы локализовали проблему для одного из них.
Также создайте простые тестовые приложения или используйте инфраструктуру модульного тестирования для тестирования определенных модулей. Например, существует Delphi версия из NUnit , которая может помочь. (Это называется DUnit ...). Такой тестовый фреймворк полезен для изоляции потоков и библиотек DLL для проверки каждого из них.

...