Вызывает ли ошибка переполнения стека дамп ядра и полезно ли это? - PullRequest
1 голос
/ 06 марта 2012

У меня очень много времени, чтобы найти ответ на этот вопрос из-за названия сайта Stack Overflow.Все онлайн ссылки на stackoverflow.com и любые слова, которые я ищу вместо этого! вау!

Мой вопрос:

  1. Не вызывает ли ошибка переполнения стека (скажем, из-за бесконечной рекурсии) дамп ядра?
  2. Полезен ли дамп основной памяти, если он сгенерирован, или GDB воспримет это как дрянь?

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Предполагается, что у вас есть настройки дампа для него.И да, это очень полезно, потому что, по крайней мере, оно может сказать вам, где переполнен стек.

Конечно, иногда дамп разворачивает стек как

foo
foo
foo
 .
 .
 .

для оченьбольшое количество foo с, но затем вы добавляете точки останова или операторы печати, чтобы увидеть, что происходило непосредственно перед сбросом стека.

0 голосов
/ 06 марта 2012

Я думаю, что без ошибок может быть / вызвано системой для переполнения стека.

Стек представляет собой буфер памяти, который может быть выделен пользователями (начальный адрес и размер). Таким образом, единственное повреждение, которое создает переполнения стека , это обычные переполнения буфера .

Например, выглядит ли ваша память как

|-----------------------|
|          ...          |
| ... 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 остановит выполнение только при обнаружении условия переполнения стека.

...