Каковы симптомы переполнения стека в программе на C ++?

StackOverflow https://stackoverflow.com/questions/562973

  •  05-09-2019
  •  | 
  •  

Вопрос

Я только что столкнулся с проблемой, когда переполнение стека в многопоточной программе c ++ на HPUX вызвало SEGV_MAPERR, когда локальный объект попытался вызвать очень простую процедуру.Некоторое время я был озадачен, но, к счастью, я поговорил с кем-то, кто признал это проблемой размера стека, и мы смогли устранить проблему, увеличив размер стека, доступный потокам.

Как я могу распознать, когда стек переполняется?Отличаются ли симптомы в Windows / linux / hpux?

Это было полезно?

Решение

Как я могу распознать, когда стек переполняется?

Если вы знаете размер стека, где начинается стек и в каком направлении он растет в памяти, вы можете просто проверить адрес указатель стека и посмотрите, дошло ли это до конца стека.C ++ не допускает прямого доступа к указателю стека.Вы могли бы легко написать небольшую функцию на ассемблере для выполнения этого анализа и связать ее с вашей программой.

Другие советы

Предполагая, что вы не находитесь на платформе, которая остановит ваше приложение и скажет "переполнение стека", я подозреваю, что вы увидите то же поведение, которое вы бы увидели при любом виде переполнения буфера.Стек - это просто еще один предварительно выделенный фрагмент памяти для вашей программы, и если вы выйдете за эти границы...что ж, удачи!Кто знает, на что ты наступишь!

Вы могли бы записать поверх показаний температуры процессора, это могло бы быть электронное письмо, которое вы набираете Ларри, это могло бы быть сообщение о том, что ядро заблокировано, вызывая забавное состояние взаимоблокировки!Кто знает.

Что касается C ++, там ничего не говорится о том, как стек должен быть расположен по отношению к другим объектам в памяти или что эта вещь даже должна быть стеком!

Код исключения 0xC00000FD в Windows.

Обычно диагностировать легче, когда вы понимаете, что ваш SEH перестает работать.

Возможно, это немного не по теме, но аналогичная проблема в Ada (нехватка места в стеке в задачах) является довольно распространенной "необычной" ошибкой.Многие компиляторы останавливают задачу (но не основную задачу) с помощью исключения PROGRAM_ERROR.

В некотором смысле, вы почти должны быть в состоянии вынюхать это.Обычно это начинается с чего-то вроде: "Я переместил этот большой массив внутри своей задачи, и внезапно он перестал работать".

Выводимый текст на экран смешался со строками кода из тестируемой программы.Также присутствовали предыдущие команды bash и другой текст неизвестного происхождения.Добавлено ко всему, что текст программы был поврежден.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top