Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Переполнение стека, что это? [D6, Win95/98, WinXP]


Страницы:   1 2

O l e g ©   (2004-09-03 03:14:00) 

Описание сути проблемы:
Действия происходили под W98.
При запуске программы выдалась ошибка на английском языке «Стек переполнен» и шестнадцатеричные числа.
Программа использует БД.
Может я не закрываю там что-нибудь.
Ошибка выскакивала только два раза, на разных версиях программы,а потом сразу же пропала сама собой. Хотя помнится при компиляции тоже один раз как то выдавал такое же, но сразу же прошло, под виндой ХП, я не придал этому значения.

Так, как избежать этой ошибки. Для это ошибка «темный лес», не знаю даже где искать. А вдруг повторится, моя первая можно сказать программа, которой пользоваться будут и не совсем хорошо работает. Помогите братья по разуму начинающему программисту.
Спасибо.


GuAV   (2004-09-08 20:04:00) [1]


> в принцыпе

Именно, что в принцыпе. При повторном переполнении стека будет уже AV. Панов поднимал эту тему не так давно, и там был сделан вывод, что всё равно не следует полагаться на корректную обработку этой ситуации системой.


Ihor Osov'yak   (2004-09-08 14:04:00) [2]

Блин.. Спрашивалось же, что такое переполнение стека...
Сори.
Подробно механизм контроля переполнения стека в Win32 описан в Рихтере (и в третьем издании, и в четвертом).
Если коротко - то это тот момент, когда указатель стека опасно приближается к пределу зарезервированного под стек региона памяти. Здесь ключевой момент - "приближается", а не выходит. Это создает предпосылки для корректного обработки исключения по этой причине. Если вспоминать времена ДОС или win16 - переполнение  стека было равно смерти программы. В Win32 вследствии вышеупромянутой выше фишке в принцыпе после "переполнения стека" можно возобновить нормальную работу программы.

Ps. А что такое стек? Так это же другой вопрос :-).


Ihor Osov'yak   (2004-09-08 13:47:00) [3]

В ключевых точках программы запись в лог файл.
Чем больше, тем лучше.
Потом изучаем лог.
===
а по сути - пути начинающих кодеров неисповедимы, они порой такое накодят, что и в страшном сне не приснится.

как вариант одного из путей - см. [21].


Defunct   (2004-09-08 03:47:00) [4]

хм.. мысли в слух:

Будем рассуждать опираясь на высказывание: "Переполнение стека происходит только при рекурсии"...

Откуда может взяться случайная/ разоваярекурсия при старте?
варианты:

- в OnCreate вызывается нечто, что зависит от текущей даты (скорее даже от времени) и приводит к автогенерации каких-то событий. (маловероятно)

- в инициализации находится нечто, что зависит от производительности машины. По какому-то событию проверяется какой-то флаг, и если он не проинициализирован, то вызывается это нечнодля его инициализации. Допустим, производительности машины не хватает, нечто- выполняется, но это нечтонеуспело проинициализировать флаг до повторной генерации события. В событии проверяется флаг, и вызывается нечто повторно. И так до тех пор пока стек не переполнен.

- Есть нечтозависящее от разрешения экрана. Например, в OnResize есть нечто, приводящее к изменению размера.(маловероятно)

- Есть какой-то таймер с небольшим интервалом между событиями, в его обработчике есть процедура, которая не успевает выполниться до повторной генерации события.

Вывод, либо в обработчике какого-то таймера не все в порядке, либо неверна последовательность инициализации форм/фреймов/структур.


O l e g   (2004-09-08 03:14:00) [5]

Defunct, При старте!


Defunct   (2004-09-07 03:24:00) [6]

Киньте на форму таймер, и в таймере проверяйте значение указателя стека, выводите его на экран. Как только пойдет резкое уменьшение, сделайте паузу в отладчике и посмотрите, что в данный момент выполняется. Раскрутитете цепочку - найдете ошибку.

Function GetStackPointer:Cardinal;Assembler;
Asm
 Mov Result, ESP
End;

Ошибки возникали при старте программы, при закрытии или в процессе работы?


O l e g   (2004-09-07 01:52:00) [7]

R, Рекурсий и goto у меня тоже нету!


O l e g   (2004-09-07 01:50:00) [8]

TUser, можно попробовать на крайняк, не плохая идея!


R   (2004-09-06 12:35:00) [9]

У меня один раз(была много раз но со странностями один) была такая ошибка все силы вымотала, не было не рекурсии, не goto да и вообще практически ничего не было, решилась так- создал новую форму все с теми же компанентами и реализациями и она исчезла,
вот и такое бывает.


TUser   (2004-09-06 08:54:00) [10]

Удалено модератором
Примечание: Оффтоп ...


SammIk   (2004-09-06 08:49:00) [11]

Система тут не причем


TUser   (2004-09-06 06:35:00) [12]

Если баг нестабилен - попробуй поставить везде, где можно try ... exc. Или сохранение в какой-нибудь лог инфы типа 'Строчка 125 выполнена успешно'. Можно будет понять, где вылетает.

PS. Всего 2 раза. А сколько всего раз программа запускалась? Если сильно больше 2х - не была ли в эти 2 раза чем-нибудь особо крутым загружена система?


O l e g   (2004-09-06 03:56:00) [13]

akvilon, может быть ты и прав.
Может он глючит. Тем более подключаю то я БД Access.


O l e g   (2004-09-06 03:53:00) [14]

SammIk,
ASMa там нет!
>Первыи шаг - воспроизвести ошибку.
>Под отладчикам, полностью протести.
Тестил и не раз! При мне никаких ошибок.
>PS: с теми данными, что ты дал, можно только обстрактно что-то >посоветовать.
Согласен сложновато! Но все равно я смотрю интересные идею проскальзывают!


akvilon   (2004-09-06 00:58:00) [15]

а если использует БД, что за драйвер к БД? если драйвер не установлен то именно такая ошибка и выскакивает, может с ним что случилось?


SammIk   (2004-09-05 20:25:00) [16]

Может ты вызываешь ф-ю не поправилам?
например cdcal Как stdcall?
Асм там есть?
Если есть, посмотри может где-то pop'ов больше чем push'ев, или наоборот.
Иожет из-зи не правильнова вызова и тд, и тп.
Первыи шаг - воспроизвести ошибку.
 Под отладчикам, полностью протести.
После того как нашел - анализируи.
PS: с теми данными, что ты дал, можно только обстрактно что-то посоветовать.


O l e g   (2004-09-05 19:33:00) [17]

Хочется чтобы небыло не каких вопросов у заказчика. Может еще что-нибудь посоветуете, здесь конечно сложно, но все таки.
А может это из-за W98? :)


O l e g   (2004-09-05 19:28:00) [18]

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


O l e g   (2004-09-05 19:24:00) [19]

Удалено модератором


DrPass   (2004-09-04 11:59:00) [20]


> А разве нельзя запустить программу под отладчиком и посмотреть,
> где она вылетает

Для этого нужно сперва знать, что такое "отладчик", что такое "стек вызовов"


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо