GDB не любит fprintf (stdout, ...);и показывает ошибку - PullRequest
1 голос
/ 10 октября 2019

Когда я использую gdb для отладки некоторого кода, мне выдается сообщение об ошибке о том, что файл stdout не существует.

Breakpoint 2, logConsumer () at debuglog.c:210
210    fprintf(stdout, msg->pre);
(gdb) s
__acrt_iob_func (index=1) at E:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/stdio/acrt_iob_func.c:11
11      E:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/stdio/acrt_iob_func.c: No such file or directory.
(gdb) s
[INFO ]
Breakpoint 3, logConsumer () at debuglog.c:211
211    fprintf(stdout, msg->msg);
(gdb) p stdout
No symbol "stdout" in current context.
(gdb) p stderr
No symbol "stderr" in current context.

Как видно в строке 7, вывод работает нормально (! ), но stdout не является определенным символом. stderr

NB : я знаю, что я должен использовать спецификатор формата, чтобы предотвратить любое разрушение стека. Элемент struct не определяется пользовательским вводом, и я упростил следующий код, чтобы найти ошибку:

FILE *dest;
dest = stdout;
// dest = stderr; doesn't throw an error
vfprintf(dest, msg->msg, vargs);

В конечном итоге я бы хотел назначить stdout или stderr указателю FILE, поэтому я не будудолжен иметь блок if..else с вызовами printf и fprintf и повторным кодом.

Поскольку код функционирует нормально как в рабочей среде, так и в отладке, я испытываю желание оставить fprintf(stdout, ...) в покое,тем более, что ошибка появляется только при переходе через указанную область - если я удаляю все точки останова и продолжаю работу, ошибки не отображаются, и мои результаты соответствуют ожидаемым. Однако мне бы очень хотелось знать, почему это происходит!


Я компилирую с

gcc -std=gnu11 -g -Iinclude -c debuglog.c

и связываю с

gcc -o app minIni.o debuglog.o main.o -Llib -lkernel32 -lole32 -static-libgcc -Wl,-Bstatic -lmingw32 -lgcc -Wl,-Bdynamic -lglew32.dll -lSDL2main -lSDL2 -lOpenGL32 -lfreetype -lavformat -lavdevice -lavcodec -lx264 -lavutil

Я использую gcc version 9.2.0 (Rev2, Built by MSYS2 project) и GNU gdb (GDB) 7.8 в Windows 7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...