应用程序段分割错误,仅在Windows上使用MinGW进行编译

问题描述:

我试图在Windows上编译one of my games,但不幸的是,无论如何,每次运行程序时都会出现此分段错误。应用程序段分割错误,仅在Windows上使用MinGW进行编译

编译成功,没有任何警告。

程序接收到的信号SIGSEGV,分段故障。

__chkstk_ms()在../../../../../src/gcc-4.8.1/libgcc/config/i386/cygwin.S:172

172 ../ ../../../../src/gcc-4.8.1/libgcc/config/i386/cygwin.S:没有这样的文件或目录。

我已经试过:

  • 编译的Windows x86机器
  • 编译了Windows x64机器上
  • nuwen.net的MinGW的发行
  • TDM的MinGW 4.8.1 SJLJ
  • MinGW构建x86 SJLJ
  • MinGW构建x64 SJLJ
  • MinGW的构建86 DW2

我已经建立了从源头多次所有的依赖,试图静态和动态连接。

调试也没有帮助 - GDB只有在输入main()后才会给出错误信息。我已使用-g3-O0标志。

我怎样才能弄清楚发生了什么?

+0

选择一种构建类型并在诊断问题时坚持使用它。做多个构建来尝试修复你不确定的错误并不是解决这个问题的方法。所有将会做的事就是混淆这个问题。话虽如此,我很惊讶gdb在执行main()之前没有办法调试代码。如果在执行main()之前无法调试,那么如何调试全局声明对象的构造函数? – PaulMcKenzie

+0

'-fstack-usage'可能会帮助你判断堆栈的使用情况。 –

在Windows上,默认堆栈大小比Linux小。 __chkstk_ms似乎是一个函数,如果你溢出你的堆栈,它会崩溃。

您可能会试图找出代码中创建大型堆栈变量或执行非常深的递归并修复该问题的位置。

或者,您可以添加一个编译标志来增加堆栈大小。请参阅http://trac.sagemath.org/ticket/13960

+0

有没有什么办法可以找出问题出在GDB的问题? –

+0

是的,您可以下载Cygwin libgcc源代码。或者,您可以尝试“x/4096a $ esp”来转储堆栈地址,这可能会提示您有关函数调用堆栈的内容。 – nneonneo

+0

@VittorioRomeo - 你真的需要工具(除了代码编辑器)来看看你是否声明占用大量内存的本地数组? – PaulMcKenzie

尝试增加堆栈大小。不要问我怎么样,我不知道。

失败的调用(__chkstk_ms)看起来像内部例程,它检查是否有足够的堆栈空间来执行函数。

+1

它也用在'alloca()'IIRC里,所以也许有一个alloca调用请求太多的堆栈导致,yup,* – stijn