У меня есть функция ERROR_OUT, которая использует vfprintf внутри для регистрации ошибок в консоли. Когда я пытаюсь записать некоторые ошибки epoll с помощью этой функции ERROR_OUT(L_NOTICE, "Epoll error: %d", errno);
иногда получаю странный вывод:
Epoll error: -1079274856
Я использую это после epoll_wait
а также epoll_ctl
только и это вызывается только в случае отрицательного возвращаемого значения.
Код ERROR_OUT:
void ERROR_OUT(int level, char *template, ...){
va_list ap;
va_start(ap, template);
if ( level <= verbosity ){
if (output_handler == NULL){
vfprintf(stderr, template, ap);
}else{
(*output_handler)(level, template, ap);
}
}
va_end(ap);
}
Код обработчика вывода:
void log_both(int level, const char *fmt, ...){
va_list argp;
va_start(argp, fmt);
vfprintf(stderr, fmt, argp);
printf("\n");
if (globalArgs.db_verbosity >= level)
globalArgs.db_log->log_error(format(fmt, argp));
va_end(argp);
}
Вы передаете va_list
в призыве к log_both
с помощью *output_handler
и заверните это va_list
в va_list
названный argp
,
Таким образом, вы на самом деле передать va_list
который содержит va_list
в vfprintf
в качестве третьего аргумента, который ожидает десятичную из-за %d
быть первым элементом в va_list
,
Поэтому должно быть void log_both(int level, const char *fmt, va_list argp){}
с va_list argp;
, va_start(argp, fmt);
а также va_end(argp);
удалены из функции тела.
void log_both(int level, const char *fmt, va_list argp){
vfprintf(stderr, fmt, argp);
printf("\n");
if (globalArgs.db_verbosity >= level)
globalArgs.db_log->log_error(format(fmt, argp));
}