Подтвердить что ты не робот

Как выполнить GetLastError() при отладке в Visual Studio

Вы переходите через код C/С++ и только что вызвали API Win32, который потерпел неудачу (обычно, возвращая некоторый бесполезный общий код ошибки, например 0). Ваш код не создает последующий вызов GetLastError(), возвращаемое значение которого вы могли бы проверить для получения дополнительной информации об ошибке.

Как вы можете получить значение ошибки без перекомпиляции и воспроизведения отказа? Ввод "GetLastError()" в окне "Часы" не работает ( "синтаксическая ошибка" ).

4b9b3361

Ответ 1

Как уже упоминалось несколько раз, псевдо-регистр @err покажет последнее значение ошибки, а @err,hr покажет ошибку как строку (если возможно).

По словам Энди Пеннелла, члена команды Visual Studio, начиная с VS 7 (Visual Studio.NET 2002), использование символа "@" для обозначения псевдо-регистров устарело - они предпочитают использовать "$" ( как в $err,hr). На данный момент поддерживаются как $, так и @.

Вы также можете использовать псевдореестр $err в условной точке останова; поэтому вы можете разбить строку кода, только если последняя ошибка отлична от нуля. Это может быть очень удобный трюк.

Некоторые другие псевдо-регистры, которые вам могут показаться удобными (из выдающейся книги Джона Роббинса "Отладка приложений для Microsoft.NET и Microsoft Windows" ):

  • $tib - показывает блок информации потока
  • $clk - показывает количество часов (полезно для функций синхронизации). Чтобы более легко использовать это, поместите часы $clk, а затем дополнительные часы $clk=0. Вторая секунда очистит псевдо регистр после отображения текущего значения, так что следующий шаг или шаг над вами даст вам время только для этого действия. Обратите внимание, что это приблизительное время, которое включает в себя справедливый бит накладных расходов отладчика, но он все равно может быть очень полезен.

Ответ 2

ERR,hr в окне просмотра обычно выполняется трюк

Ответ 3

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

В качестве бонуса вы также можете оставить новый код для будущего.

Если вы не можете этого сделать, QBziZ прав "ERR, hr" делает это.