Каковы симптомы переполнения стека в программе на C ++? - PullRequest
6 голосов
/ 19 февраля 2009

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

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

Ответы [ 5 ]

10 голосов
/ 19 февраля 2009

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

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

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

2 голосов
/ 19 февраля 2009

Как распознать переполнение стека?

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

0 голосов
/ 24 октября 2016

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

0 голосов
/ 19 февраля 2009

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

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

0 голосов
/ 19 февраля 2009

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

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

...