Советы и рекомендации отладчика Visual Studio (для проектов C/С++)
Мне интересны советы и рекомендации относительно отладки проекта C/С++ в отладчике Visual Studio. Недавно я узнал, что если у вас есть указатель на определенный тип данных, скажем char * ptr, то вы можете увидеть его как массив в окне часов, используя синтаксис, например:
ptr,10
Это отобразит первые 10 элементов из адреса ptr, так же, как оно будет отображаться, если определение будет:
char ptr[10];
Какие еще советы и рекомендации вы знаете об отладчике Visual Studio?
PS: Надеюсь, этот вопрос еще не обсуждался. Если вы найдете подобный пост, пожалуйста, дайте мне знать.
Ответы
Ответ 1
Мне очень нравится настраивать отображение Debugger типов и структур с помощью AutoExp.dat. Файл находится в
..\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\autoexp.dat
и позволяет определять собственные шаблоны для отображения данных во время отладки:
Во время отладки, Советы по данным и элементы в окнах Watch и Variable автоматически расширяются, чтобы показать свои наиболее важные элементы. Расширение следует формату, заданному правилами в этом файле. Вы можете добавить правила для ваши типы или изменить предопределенные правила.
В файле полно хороших примеров, и вы можете легко адаптировать определенные шаблоны к своим потребностям или добавить новые для своих собственных классов.
Ответ 2
Вы можете установить имена своих потоков, используя несколько неудобный код. См. Статью в MSDN.
Ответ 3
Возможно, самым важным советом, который вы можете использовать, является DebugBreak.
Поместите DebugBreak() в свой код и когда он выполнит его, как попадание точки останова.
Самое приятное, что вы можете тогда установить на него условные обозначения, которые могут быть трудно установить на регулярной точке останова. Научитесь использовать это!
Например, ваша программа сбой, когда он переваривает определенный файл данных. Вы обнаружите, что он сбой в определенной функции, но только после того, как он назвал миллион раз +.
Вы также выяснили, что он сбой, потому что определенная переменная вызывает его x имеет значение 1001, но x должно быть от 0 до 1000. Поэтому вместо того, чтобы надеяться, что к счастью поймать место, где x станет большим, вы найдете каждый место, где x изменяется. Сразу после этого вы делаете выражение:
if (x > 1000) DebugBreak();
Да, вы можете сделать это с условными точками останова, но я видел программу, которая занимает 1 секунду, чтобы выполнить медленную до 15 минут с тремя конидиальными точками останова, но выполнить через 1,5 секунды с помощью DebugBreak.
Сказав, что вот пара полезных предложений. Математически докажите себе, что причина, по которой вы думаете, что происходит ошибка, объясняет, что фактическая ошибка происходит, по крайней мере, часть времени (вряд ли две ошибки создадут ту же проблему, но это произойдет). Я видел некоторые из самых глупых исправлений, созданных на месте, потому что люди "чувствуют", что резонанс для ошибки. Убедитесь, что ваша логика так же звучит, как любое доказательство в классе геометрии.
Второе предложение, если вы установите экспериментальное исправление, и оно ничего не делает. Вытащите его.
Ответ 4
Некоторые другие советы и трюки, которые я нашел в этой статье:
ptr,su -> display ptr as if it was a string of unicode chars.
val,hr -> view val as a hresult data
val,wc -> view val as a window class
val,wm -> view val as a window message
Ответ 5
Некоторые люди фактически не понимают, что вы можете изменить значения переменных и переместить точку выполнения. Это очень полезно, если вы нажмете точку останова после строки кода, которая вам интересна, и вы хотите попробовать ее снова с разными значениями.
Ответ 6
Блог SaraFord блестящий для визуальных советов и советов студии -
Sara Ford Weblog
Ответ 7
-
Некоторые советы по отладке/просмотру:
Используйте следующее в окне "Часы", чтобы узнать, что вернет GetLastError():
@ERR, ч
-
Если вы используете Visual Studio 2003 или ранее, используйте это выражение для просмотра длины вашего std::vector v:
v._Mylast-v._Myfirst
Вы также можете указать список, например. первые 5 записей с этим выражением:
v._Myfirst, 5
Это не работает при использовании STLport и метод, устаревший в VS >= 2005 с помощью новых визуализаторов выражений.
-
Если вы хотите увидеть возвращаемое значение функции, посмотрите на регистр eax (просто введите eax в окне просмотра). Вы даже можете изменить возвращаемое значение. Если это указатель на строку или массив, вы также можете ввести eax в окне "Память", чтобы увидеть базовую строку.