Когда я использую 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.