У меня есть приложение, которое перешло в состояние зависания. Это приложение действительно представляет собой комбинацию из трех разных exes. UI.exe, core.exe, core.dll. все они в основном построены на VC ++. поэтому, когда я просматриваю журналы приложений, я вижу, что ui.exe где-то остановлен. Поэтому я взял мини-дамп с полными данными приложения через диспетчер задач-> процессы-> выберите файл ui.exe и core.exe, щелкните его правой кнопкой мыши и выберите «Создать файл дампа». У меня есть около 150 МБ + данных, представленных в файле ui.exe dmp. как это проанализировать?
Пока я могу загрузить файл дампа со всеми необходимыми ему файлами pdb (приложение + система) и успешно загрузить значения. Я могу видеть, что приложение работает, но не отвечает на запрос core.exe.
Теперь я действительно ищу данные приложения, находящиеся в куче и стеке ui.exe и core.exe, с помощью которых я могу проверить, куда накапливаются данные. какая переменная / массив поглощает значение. Кто-нибудь может сказать мне путь для этого?
Есть несколько вариантов, в зависимости от типа зависания. Одним из них является низкая зависание процессора, что может привести к тупику. Другой — высокая загрузка процессора, которая может быть бесконечной петлей. Отладка тупика, как правило, проще, поскольку вы получаете хорошие и всегда одинаковые стеки вызовов. Отладка высокого зависания процессора сложнее, потому что могут быть разные стеки вызовов, в зависимости от времени, когда вы взяли дамп. Вам понадобится несколько дампов — или лучше используйте профилировщик.
Чтобы ответить на ваши вопросы:
Как это проанализировать?
Есть три основных варианта
!analyze -v
как ваша первая команда. Но в любом случае попробуйтеКто-нибудь может сказать мне способ для этого? [выяснение, где данные накапливаются]
Я не могу ясно увидеть, как большой объем данных связан с зависшим приложением. Данные находятся в стеке или в куче, в зависимости от того, как вы реализовали свое приложение. Обратите внимание, что в C ++ нет четкого отображения между типами объектов и памятью, как в .NET. Вы не можете просто набрать команду, как Покажите мне все объекты типа Xyz.
В Visual Studio вам могут повезти с локальными переменными и т. Д., Поскольку они могут быть разрешены. В WinDbg вы бы использовали некоторые из !heap
команды и, возможно, настроить некоторые Gflag настройки для отслеживания распределения памяти.