Вопрос

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

Буду признателен за любые советы, указатели.

Это было полезно?

Решение

Возможно, вы также захотите предоставить это расширение отладчика попробовать.Это библиотека под названием SDbgExt, разработанная Небесный Крылатый.

Другие советы

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

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

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

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

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

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

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

Используйте dt -r то есть dt yourapp!класс 7ffdf000 -r5

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top