堆栈溢出错误是否会触发核心转储,如果有,它是否有用?

时间:2012-03-06 02:29:33

标签: c++ gdb stack-overflow

由于“Stack Overflow”的网站名称,我有时间找到答案。所有在线参考stackoverflow.com和我搜索的任何单词!的华!

我的问题是:

  1. 堆栈溢出错误(例如来自无限递归)会导致核心转储吗?
  2. 核心转储是否有用,如果它确实生成了一个,或者GDB将其视为乱码?

2 个答案:

答案 0 :(得分:3)

它假设你已经为它设置了转储设置。是的,它非常有用,因为它至少可以告诉你堆栈溢出的位置。

当然,有时转储会将堆栈展开为

foo
foo
foo
 .
 .
 .

对于非常大量的foo,但是然后添加断点或打印语句以查看堆栈转储之前发生的情况。

答案 1 :(得分:0)

我认为系统会因堆栈溢出而触发无错误

堆栈是一个内存缓冲区,可以由用户分配(初始地址和大小)。因此,堆栈溢出造成的唯一损害是通常的缓冲区溢出

例如,你的记忆是否像

|-----------------------|
|          ...          |
| ... valuable data ... | 
|          ...          |
|-----------------------|
|          ...     ^    |
|          ...     |    |
|          stack   |    | 
|-----------------------|

然后stackoverflow将清除您的数据。 它显然也依赖于实现和体系结构,例如,如果调试信息在这个地方(例如,线程细节存储在内存中),那么它会搞乱调试器的行为。

如@MSalters所提到的

< edit> ,这部分不是(完全?)true,这意味着内核确保堆栈保持在其边界内。在这种情况下,应该没有任何东西阻止调试器读取stackoverflow coredump。< / edit>

使用GDB Python可以让你在溢出过程中停止执行,例如:(未经测试)

FCT_NAME = "my_function" 
MAX_DEPTH = 100 
class StackOverflowBreakpoint(gdb.Breakpoint):
  def stop(self):
    frame = gdb.newest_frame()
    depth = 0
    while frame is not None:
      frame = frame.older()
      depth += 1
    # stop only if we're deep enough
    return depth > MAX_DEPTH

bp = StackOverflowBreakpoint(FCT_NAME)
bp.silent = True
每次触发该函数时都会调用

StackOverflowBreakpoint.stop,但只有在检测到stackoverflow条件时,GDB才会停止执行。