Я думаю, что без ошибок может быть / вызвано системой для переполнения стека.
Стек представляет собой буфер памяти, который может быть выделен пользователями (начальный адрес и размер). Таким образом, единственное повреждение, которое создает переполнения стека , это обычные переполнения буфера .
Например, выглядит ли ваша память как
|-----------------------|
| ... |
| ... valuable data ... |
| ... |
|-----------------------|
| ... ^ |
| ... | |
| stack | |
|-----------------------|
тогда стекопоток уничтожит ваши данные.
Это также очевидно зависит от реализации и архитектуры, например, если бы отладочная информация была в этом месте (например, подробности потока хранятся в памяти), то это могло бы испортить поведение отладчика.
, как упомянуто @MSalters, эта часть не является (полностью?) Истинной, что означает, что ядро гарантирует, что стек остается в своих границах. В этом случае не должно быть ничего, что мешало бы отладчикам читать coredumps stackoverflow.
Игра с 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
будет вызываться при каждом запуске функции, но GDB остановит выполнение только при обнаружении условия переполнения стека.