2010-11-08 4 views
1

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

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

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

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

+0

Не может ли это быть ошибкой в ​​TestComplete? –

+0

Если во время тестирования TestComplete происходит * в основном *, то иногда * * иногда * происходит * не * с помощью TestComplete, поэтому, вероятно, это не ошибка в TestComplete, @Workshop. –

+0

Когда TestComplete увеличивает количество раз, которое происходит при замораживании, возможно, это проблема времени. Это, как представляется, состояние гонки, возможно, связано с критическим разделом или другими ресурсами, которые используются. Вопрос в том, есть ли что-нибудь в вашем коде, которое может вызвать такие условия гонки? –

ответ

9

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

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

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

+0

Хорошо сказано. Сильно прикомандирован. – gabr

+0

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

5

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

+0

Возможно, это вызвано исключением? Мы уже используем ExceptionMagic, но я думаю, что MadExcept или EurekaLog предоставят больше информации. – Vegar

+1

MadExcept - хороший выбор, мы используем его в течение многих лет. Спасатель жизни в бесчисленных ситуациях. Для вашей проблемы, как только вам удалось воспроизвести ее, я рекомендую использовать madTraceProcess (поставляется с madExcept). Он доставит вам столбеки каждого потока. Сделайте это несколько раз, пока приложение заморожено - и вы должны получить представление о реальной проблеме. –

0

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

3

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

0

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

Удача

Смежные вопросы