gdb不喜欢fprintf(stdout,...);并显示错误

时间:2019-10-10 12:39:43

标签: c windows gdb

当我使用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都不是,但是当我使用它时,gdb不会抱怨。

N.B。:我知道我应该使用格式说明符来防止堆栈崩溃。 struct元素不是由用户输入确定的,我正在简化以下代码以查找错误:

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

最终,我想将stdout或stderr分配给FILE指针,因此我不必通过if..elseprintf调用和重复的代码来创建fprintf块。 / p>

由于代码在生产和调试中都可以正常运行,所以我很想离开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

我在Windows 7上使用gcc version 9.2.0 (Rev2, Built by MSYS2 project)GNU gdb (GDB) 7.8

0 个答案:

没有答案