Отладка контейнеров STL STL в Windbg

Вентиляторы Windbg утверждают, что он довольно мощный, и я склонен согласиться. Но когда дело доходит до отладки контейнеров STL, я всегда застрял. Если переменная находится в стеке, расширение !stl иногда показывает это, но когда контейнер с сложным типом (например, std::vector<TemplateField, std::allocator<TemplateField> >) находится в куче или части какой-либо другой структуры, я просто не знаю, как для просмотра его содержимого.

Оцените любые подсказки, указатели.

Ответ 2

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

Ответ 3

Расширение Python для WinDbg (pykd) имеет фрагмент stlp.py, который может сбросить содержимое карты.
В настоящее время он поддерживает реализацию карты STLPort. Протестировано на x86 и x64. Эта статья демонстрирует, как ее использовать (ее на русском языке, но, примеры не требуют пояснений).

Ответ 4

У меня был тот же самый вопрос некоторое время назад. Я отвечаю, что Visual Studio действительно лучший отладчик для STL и сложных типов (так же, как Visual Studio - это просто лучший отладчик, чем MDbg).

Это не означает, что WinDBG менее эффективен, просто чтобы он был ниже уровня (например, попробуйте сделать что-нибудь полезное с дампами сбоев с помощью Visual Studio - вы не можете).

В любом случае, чтобы ответить на ваш вопрос, вы можете использовать Visual Studio для просмотра типов данных с помощью некоторых трюков:

  • Запустите еще один экземпляр WinDBG, добавьте неинвазивно: cdb -p <PID> -pv. Это приостановит потоки дебюта. Теперь вы можете безопасно отсоединить оригинальный WinDBG qd
  • Прикрепите к нему Visual Studio, а затем отсоедините неинвазивный WinDBG qd. Посмотрите на STL и продолжайте, как хотите.
  • Когда вам нужно вернуться к WinDBG, перейдите к шагу 1, замените его на инвазивный WinDBG.

Ответ 5

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

Ответ 6

Использовать dt -r i.e dt yourapp! class 7ffdf000 -r5