由于“Stack Overflow”的网站名称,我有时间找到答案。所有在线参考stackoverflow.com和我搜索的任何单词!的华!
我的问题是:
答案 0 :(得分:3)
它假设你已经为它设置了转储设置。是的,它非常有用,因为它至少可以告诉你堆栈溢出的位置。
当然,有时转储会将堆栈展开为
foo
foo
foo
.
.
.
对于非常大量的foo
,但是然后添加断点或打印语句以查看堆栈转储之前发生的情况。
答案 1 :(得分:0)
我认为系统会因堆栈溢出而触发无错误。
堆栈是一个内存缓冲区,可以由用户分配(初始地址和大小)。因此,堆栈溢出造成的唯一损害是通常的缓冲区溢出。
例如,你的记忆是否像
|-----------------------|
| ... |
| ... valuable data ... |
| ... |
|-----------------------|
| ... ^ |
| ... | |
| stack | |
|-----------------------|
然后stackoverflow将清除您的数据。
它显然也依赖于实现和体系结构,例如,如果调试信息在这个地方(例如,线程细节存储在内存中),那么它会搞乱调试器的行为。
< 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才会停止执行。