создать простую библиотеку журналирования в CI есть три файлавина Сегментация на vsprintf с использованием макросов в C
Мой пример файла:
- example.c
Библиотека файлов:
- loglib.h
- logl ib.c
Основная функция моего регистратора называется logme
. Я определил различные макросы в обертках для обозначения различных уровней журнала:
например
- WARN
- ERROR
- и т.д ..
В example.c я называю макросы:
int int_arg = 55;
WARN(1, "Warn message with level 1");
WARN(1, "Warn message with level %d", int_arg);
макрос определяется в loglib.h
:
#define WARN(LEVEL, ...) \
logme(LEVEL, 8, " <%s:%d> inside %s() -- "__VA_ARGS__, __FILE__, __LINE__, __func__);
И, наконец, вот logme
функция:
void slog(int level, int flag, const char *msg, ...)
{
char string[10000];
bzero(string, sizeof(string));
va_list args;
va_start(args, msg);
vsprintf(string, msg, args);
va_end(args);
// .. do other things
}
Когда я запускаю пример файла это то, что я получаю:
inside main() -- Warn message with level 1
Segmentation fault (core dumped)
Я получаю когда я вызываю WARN
со сформированными строками.
Неисправность сегментации появляется в vsprintf(string, msg, args);
Это что-то не так с моим макро?
Вот сделайте файл моего Lib:
CFLAGS = -g -O2 -Wall -lpthread
LIB = -lrt
OBJS = loglib.o
LIBINSTALL = /usr/local/lib
HEADINSTALL = /usr/local/include
.c.o:
$(CC) $(CFLAGS) -c $< $(LIB)
libslog.a: $(OBJS)
$(AR) rcs liblog.a $(OBJS)
@echo [-] Syncing static library
sync
install:
@test -d $(LIBINSTALL) || mkdir $(LIBINSTALL)
@test -d $(HEADINSTALL) || mkdir $(HEADINSTALL)
@install -m 0664 liblog.a $(LIBINSTALL)/
@install -m 0664 loglib.h $(HEADINSTALL)/
@echo [-] Done
loglib.o: loglib.h
.PHONY: clean
clean:
$(RM) liblog.a $(OBJS)
пожалуйста, вы можете показать мне, как сделать это? Я не мог понять это, и документация, которую я нашел, не дает такого подробного примера. –