#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 для просмотра типов данных с помощью некоторых хитростей:
- Запустите другой экземпляр WinDbg, прикрепите неинвазивно:
cdb -p <PID> -pv
. Это приведет к приостановке потоков отладчика. Теперь вы можете безопасно отсоединить оригинальный WinDbgqd
- Прикрепите к нему Visual Studio, а затем отсоедините неинвазивный WinDbg
qd
. Посмотрите на STL и продолжайте, как хотите. - Когда вам нужно вернуться в WinDbg, перейдите к шагу 1, поменяйтесь местами с инвазивным WinDbg.
Ответ №5:
Обычно я заканчиваю тем, что toString()
применяю метод во многих своих классах. Это показывает всю информацию, которую я считаю важной, затем любые контейнеры могут вызвать это, чтобы отобразить информацию о классе в консоли
Ответ №6:
Используйте dt -r, то есть dt yourapp!класс 7ffdf000 -r5