Советы и хитрости отладчика Visual Studio (для проектов C / C ++) - PullRequest
15 голосов
/ 20 октября 2008

Меня интересуют советы и рекомендации по отладке проекта C / C ++ в отладчике Visual Studio. Недавно я обнаружил, что если у вас есть указатель на определенный тип данных, скажем, char * ptr, то вы можете увидеть его в виде массива в окне просмотра, используя такой синтаксис, как:

ptr,10

Это отобразит первые 10 элементов из адреса ptr, так же, как это было бы, если бы определение было:

char ptr[10];

Какие еще советы и хитрости вы знаете о отладчике Visual Studio?

PS: Надеюсь, эта тема еще не обсуждалась. Если вы найдете похожий пост, пожалуйста, дайте мне знать.

Ответы [ 7 ]

9 голосов
/ 20 октября 2008

Мне очень нравится возможность настраивать отображение типов и структур отладчика через AutoExp.dat . Файл находится на

.. \ Microsoft Visual Studio 9.0 \ Common7 \ Packages \ Debugger \ autoexp.dat

и позволяет определять собственные шаблоны для отображения данных во время отладки:

Во время отладки, Советы и данные в окнах Watch и Variable автоматически расширяется, чтобы показать их самые важные элементы. Расширение следует формату, указанному в правилах в этом файле. Вы можете добавить правила для ваши типы или изменить предопределенные правила.

Файл полон хороших примеров, и вы можете легко адаптировать определенные шаблоны к вашим собственным потребностям или добавить новые для ваших собственных классов.

6 голосов
/ 20 октября 2008

Вероятно, самый важный совет, который вы можете использовать, это DebugBreak. Поместите DebugBreak () в свой код, и когда он выполняется, это все равно что достичь точки останова.

Самое приятное в том, что вы можете наложить на него условные выражения, которые трудно установить на обычную точку останова. Научитесь использовать это!

Например, ваша программа падает, когда переваривает определенный файл данных. Вы обнаруживаете, что происходит сбой в определенной функции, но только после того, как ее вызвали миллион раз. Вы также выяснили, что это происходит сбой, потому что определенная переменная с именем x имеет значение 1001, но предполагается, что x находится между 0 и 1000. Таким образом, вместо того, чтобы надеяться на удачу поймать место, где x становится большим, вы найдете каждый Поместите это х меняется. Сразу после этого вы положили заявление: if (x> 1000) DebugBreak ();

Да, вы можете сделать это с условными точками останова, но я видел программу, которая за 1 секунду выполняет замедление до 15 минут с тремя условными точками останова, но выполняется за 1,5 секунды с DebugBreak.

Сказав, что вот несколько полезных предложений. Математически докажите себе, что причина, по которой вы думаете, что ошибка происходит, объясняет фактическую ошибку, происходящую, по крайней мере, часть времени (маловероятно, что две ошибки создают одну и ту же проблему, но это происходит). Я видел некоторые из самых глупых исправлений, потому что люди «чувствуют», что является причиной ошибки. Убедитесь, что ваша логика так же надежна, как и любое доказательство в классе геометрии.

Второе предложение, если вы добавите экспериментальное исправление, а оно ничего не даст. Возьми это.

6 голосов
/ 20 октября 2008

Вы можете установить имена своих потоков, используя несколько неуклюжий кусок кода. См. Эту статью на MSDN .

5 голосов
/ 20 октября 2008

Некоторые другие советы и хитрости, которые я нашел в этой статье:

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
4 голосов
/ 20 октября 2008

Некоторые люди на самом деле не понимают, что вы можете изменить значения переменной и переместить точку выполнения. Это очень полезно, если вы достигли точки останова после интересующей вас строки кода и хотите повторить попытку с другими значениями.

3 голосов
/ 20 октября 2008
  • Некоторые советы по отладке / просмотру:

    Используйте следующее в окне Watch, чтобы узнать, что вернет GetLastError ():

    @ ERR, ч

  • Если вы используете Visual Studio 2003 или более раннюю версию, используйте это выражение наблюдения, чтобы узнать длину вашего std :: vector v:

    v._Mylast-v._Myfirst

    Вы также можете перечислить, например, первые 5 записей с этим выражением:

    v._Myfirst, 5

    Это не работает при использовании STLport и метода, устаревшего в VS> = 2005 с новыми визуализаторами выражений.

  • Если вы хотите увидеть возвращаемое значение функции, посмотрите на регистр eax (просто введите eax в окне просмотра). Вы даже можете изменить возвращаемое значение. Если это указатель на строку или массив, вы также можете ввести eax в окне Память, чтобы увидеть базовую строку.

3 голосов
/ 20 октября 2008

Блог SaraFord великолепен для визуальных студийных подсказок и советов - Блог Сары Форд

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...