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

#c #stl #windbg

Вопрос:

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

Ценю любые советы, указатели.

Ответ №1:

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

Ответ №2:

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

Ответ №3:

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

Ответ №4:

У меня был точно такой же вопрос некоторое время назад. Мой ответ заключается в том, что 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.

Ответ №5:

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

Ответ №6:

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