Отладка контейнеров C ++ STL в Windbg - PullRequest
10 голосов
/ 27 сентября 2008

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

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

Ответы [ 6 ]

3 голосов
/ 27 сентября 2008

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

2 голосов
/ 10 апреля 2011

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

2 голосов
/ 15 октября 2008

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

1 голос
/ 05 января 2011

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

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

0 голосов
/ 27 сентября 2008

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

...