Я обнаружил, что использование макроса _RPT()
также будет работать с исходным файлом C в Visual Studio 2005. Эта статья Отладка с помощью Visual Studio 2005/2008: ведение журнала и трассировка содержит обзор TRACE, _RPT и другие макросы типа ведения журнала.
Я генерирую строку для файла журнала, который называется ASSRTLOG, который содержит журналы, и при записи журнала в файл я также делаю следующую строку исходного кода:
_RPT1(_CRT_WARN, "ASSRTLOG: %s", szLog1);
Эта строка помещает тот же журнал, который поступает в файл журнала, в окно вывода IDE Visual Studio 2005.
Возможно, вас заинтересует механика, лежащая в основе подхода, который мы используем для регистрации. У нас есть функция PifLogAbort()
, которая принимает ряд аргументов, которые затем используются для создания журнала. Эти аргументы включают в себя имя файла, в котором создается журнал, а также номер строки. Макрос выглядит так:
#define NHPOS_ASSERT_TEXT(x, txt) if (!(x)) { PifLogAbort( (UCHAR *) #x , (UCHAR *) __FILE__ , (UCHAR *) txt , __LINE__ );}
и прототип функции для PifLogAbort()
выглядят так:
PifLogNoAbort(UCHAR *lpCondition, UCHAR *lpFilename, UCHAR *lpFunctionname, ULONG ulLineNo)
и для использования макроса мы вставим такую строку:
NHPOS_ASSERT_TEXT(sBRetCode >= 0, "CliEtkTimeIn(): EtkTimeIn() returned error");
Что будет делать этот макрос, так это то, что если код возврата меньше 0 (утверждение не выполняется), будет создан журнал с предоставленным текстом. Журнал включает в себя условие создания журнала, а также имя файла и номер строки.
Функция PifLogAbort()
создает журналы указанной длины и обрабатывает выходной файл как кольцевой буфер. Журналы также имеют отметку времени и даты.
В тех случаях, когда мы хотим динамически генерировать описательный текст во время выполнения, возможно, для предоставления действительного значения кода ошибки, мы используем функцию sprintf () с буфером, как в следующей последовательности кода:
if (sErrorSave != STUB_BM_DOWN) {
char xBuff[128];
sprintf(xBuff, "CstSendBMasterFH: CstComReadStatus() - 0x%x, sError = %d", usCstComReadStatus, CliMsg.sError);
NHPOS_ASSERT_TEXT((sErrorSave == STUB_BM_DOWN), xBuff);
}
Если мы хотим, чтобы журналы не генерировались, все, что нам нужно сделать, - это перейти к файлу с одним заголовком, в котором определен макрос, и определить его как ничто, а затем перекомпилировать. Однако мы обнаружили, что эти журналы могут быть очень полезны при исследовании проблем на местах и особенно полезны при интеграционном тестировании.