2012-05-14 83 views
1

我有一个非常奇怪的段错误,我最终今天修复。看来问题是我在堆栈上分配了一个非常大的数组,导致了这个问题。堆栈溢出vs段落

我的问题是,你总是得到一个堆栈溢出的SEGV信号?是否有任何特殊信号可以提醒存在堆栈溢出问题?

我使用g ++和gdb一起使用。

回答

2

Unix信号意义上的“信号”显然是SEGV。 :)如果你的意思是使用诊断工具的信号,它会告诉你什么时候发生了不好的事情,你可以尝试valgrind,但实际上,你的系统只是告诉你。并且在编译时知道堆栈是否会溢出是不可能的,部分原因是堆栈大小限制是一个运行时参数,除此之外,我想如果你知道它是先验的,你仍然会被卡住停止问题。

+0

我明白了。问题是,这只是在非常大的问题大小,几乎不可能用valgrind治疗。在问题规模较小时,valgrind没有告诉我任何内容,代码工作正常! GDB也在制作一个段错误,并指出一条与它无关的线......我希望gdb可以抓住堆栈并产生更有意义的错误! – GradGuy

+0

实际上,对于'gcc',使用'-Wframe-greater-than = len'标志是保守的。见http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html –

+1

@DavidTitarenco:OP可以告诉我们更好的,但我不确定这种选择将有助于在这种情况下,因为它似乎是在满足某些运行时条件时会发生的问题,例如大数据量,这可能导致大堆栈深度或以“alloca”样式分配大数组。 –