Одна из причин, по которой вы сообщаете отладочную информацию stderr
, а не stdout
, поскольку stdout
может отправляться по конвейеру, и ваша диагностика будет работать с фактическими данными, что приведет к путанице на последующих этапах конвейера.
Если вы хотите перенаправить вывод или добавить метки времени (или PID, или любую другую информацию), то не используйте fprintf()
напрямую.Вызовите функцию своего собственного устройства, которая обрабатывает информацию, которую вы хотите, так, как вы хотите.
Таким образом, ваш макрос может быть:
extern void dbg_print(const char *fmt, ...);
#define DEBUG_PRINT(fmt, ...) \
do { if (DEBUG_TEST) dbg_print(fmt, __VA_ARGS__); } while (0)
Или:
extern void dbg_print(const char *func, const char *file, int line, const char *fmt, ...);
#define DEBUG_PRINT(fmt, ...) \
do { if (DEBUG_TEST) dbg_print(__func__, __FILE__, __LINE__, fmt, __VA_ARGS__); } while (0)
Это включает в себя имя функции, имя файла и номер строки в информации
Например, у меня есть довольно сложный пакет, который делает это.Одна из основных внутренних подпрограмм:
/* err_stdio - report error via stdio */
static void err_stdio(FILE *fp, int flags, int errnum, const char *format, va_list args)
{
if ((flags & ERR_NOARG0) == 0)
fprintf(fp, "%s: ", arg0);
if (flags & ERR_STAMP)
{
char timbuf[32];
fprintf(fp, "%s - ", err_time(timbuf, sizeof(timbuf)));
}
if (flags & ERR_PID)
fprintf(fp, "pid=%d: ", (int)getpid());
vfprintf(fp, format, args);
if (flags & ERR_ERRNO)
fprintf(fp, "error (%d) %s\n", errnum, strerror(errnum));
}
Оболочки отладки могут вызывать эту функцию с соответствующими флагами и генерировать желаемый результат.Другие части системы управляют используемым потоком файлов (по умолчанию stderr
, но есть функция перенаправления вывода в любой другой поток) и т. Д.
Если вы ограничиваете себя с помощью fprintf()
непосредственно в макросе отладки, вы застряли с тем, что может fprintf()
сделать, или перекомпилировать все.
См. также мой ответ на 'C #define макрос для отладочной печати' для получения дополнительной информацииинформация об отладочных макросах и о том, как их использовать (хотя, похоже, вы уже взяли на борт большую часть того, что я там сказал).