Ошибка окна вывода Visual Studio — C

#c #visual-studio-2008 #winapi #output-window

#c #visual-studio-2008 #winapi #окно вывода

Вопрос:

Используя Visual Studio 2008, я продолжаю видеть эту ошибку в окне вывода:

_CrtDbgReport: слишком длинная строка или ошибка ввода-вывода

У меня есть много TRACE макросов, разбросанных по всему моему коду, используемых для сброса информации об условиях ошибки: путь к файлу, номер строки, ошибка и т.д. Мне нужно отследить источник этой ошибки, потому что, возможно, информация, которую он пытается сбросить в окно вывода, слишком длинная. Какую максимальную длину строки может принять TRACE макрос? Вот пример того, как я обычно использую этот макрос:

 TRACE(_T("CreateNotifyWindow : Failed to create handle for notify window thread.rntError: %drntFile: %srntLine: %drn"), ::GetLastError(), _T(__FILE__), __LINE__);
  

Любые мысли будут оценены. Спасибо.

Комментарии:

1. Это происходит потому, что ваш вывод содержит символы Юникода, которые недоступны для преобразования ANSI в окне вывода VS. Вы можете попробовать использовать OutputDebugString вместо этого, но это может привести к аналогичным проблемам.

Ответ №1:

В конечном счете, я готов поспорить, проблема заключается в передаче объектной строки вместо string.c_str() в макрос. ТРАССИРОВКА использует переменный аргумент, передаваемый, в конечном счете, чему-то, что вызывает что-то в семействе vsnprintf() для %s обработки. Он не может обрабатывать объекты, потому что C не может.

Максимальная длина OutputDebugString составляет 4K байт минус дробь из-за реализации.

Комментарии:

1. Ограничение на количество символов в TRACE макросе MFC равно 1023 wchars

Ответ №2:

У вас та же проблема, что и у меня. Я получил ответ на этот вопрос в Интернете, и я проверил его, который сработал очень хорошо.

 // Inside your main header like stdafx.h, add the following include directive

#include <locale.h>


// And inside your main implementation such as InitInstance()
// of your CWinApp derived application class,
// you can put the following locale designation function.

#ifdef _DEBUG
_tsetlocale(LC_ALL, _T("korean")); // you should set the country code of yours
#endif // _DEBUG
  

Теперь вы можете увидеть правильную строку с широкими символами в окне вывода отладки.
Удачи!