c - MinGW fprintf (vswprintf) 导致段错误

标签 c gcc mingw

我有以下示例程序,它使用预处理器定义一个简单的调试函数。

main.c

#include <stdio.h>
#ifdef DEBUG
#define __DEBUG 1
#else
#define __DEBUG 0
#endif
#define dbg_out(fmt, ...) \
    do {if (__DEBUG) fprintf(stdout, "%s:%s:%s():" fmt "\n", __FILE__, \
                           __LINE__, __FUNCTION__, __VA_ARGS__); } while (0)

int main (int argc, char **argv)
{
    dbg_out ("Printing argc: %d", argc);
    return 0;
}

我使用调试符号和定义的 DEBUG 来编译它,如下所示:

gcc main.c -g -DDEBUG -o test.exe

现在,当我编译该程序并运行它时,我得到一个带有以下回溯的 SIGSEGV:

Program received signal SIGSEGV, Segmentation fault.
0x75b7b090 in vswprintf () from C:\Windows\SysWOW64\msvcrt.dll

(gdb) bt

#0  0x75b7b090 in vswprintf () from C:\Windows\SysWOW64\msvcrt.dll
#1  0x75b73633 in msvcrt!fprintf () from C:\Windows\SysWOW64\msvcrt.dll
#2  0x75bb1228 in msvcrt!_iob () from C:\Windows\SysWOW64\msvcrt.dll
#3  0x0040a070 in __register_frame_info ()
#4  0x00401425 in main (argc=1, argv=0x4a2f08) at src/main.c:16

GCC (MinGW) 版本为 4.8.1。为什么会发生这种崩溃?如何解决?

最佳答案

预处理器宏 __LINE__ 不是 char *,而是 int,因此:

#define dbg_out(fmt, ...) \
    do {if (__DEBUG) fprintf(stdout, "%s:%s:%s():" fmt "\n", __FILE__, \
                           __LINE__, __FUNCTION__, __VA_ARGS__); } while (0)

需要:

#define dbg_out(fmt, ...) \
    do {if (__DEBUG) fprintf(stdout, "%s:%d:%s():" fmt "\n", __FILE__, \
                           __LINE__, __FUNCTION__, __VA_ARGS__); } while (0)

请注意,如果在启用警告的情况下进行编译(例如 gcc -Wall ...),gcc 会警告您这一点。

关于c - MinGW fprintf (vswprintf) 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33605512/

相关文章:

c - 程序因信号 SIGABRT 终止,已中止

c++ - GCC、字符串化和内联 GLSL?

c - 使用字符串作为数组索引标识符(无循环)

dll - 构建 dll 并链接到它?

C - 如何在 for 循环中每次在不同的变量上迭代相同的指令

c++ - 将 R/O 分区挂载为 R/W 进行写入,然后在 C 中设置回 R/O

c - 将错误的 C 原型(prototype)显示为构建警告

c - 在 OS X 上使用 -m32 编译 union 的冗余大小

gcc - 在启用 AESNI 内在函数的情况下调用 _mm_loadu_si128() 失败

c++ - eclipse MinGW : how to have multi main in one project