Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

Переполнение стека, что это?   Найти похожие ветки 

 
O l e g   (2004-09-03 03:14) [0]

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

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


 
Ozone ©   (2004-09-03 06:03) [1]

Телепатов тут нет... Приведи место, на котором она "выскакивает"


 
КаПиБаРа ©   (2004-09-03 06:44) [2]

O l e g   (03.09.04 3:14)
Для это ошибка «темный лес», не знаю даже где искать.

1. Там где есть рекурсии.
2. Там где есть goto
3. Везде


=========================================
Мир теряет своих гениев: Эйнштейн умер,
Бетховен оглох, теперь вот у меня что-то
голова побаливает
=========================================


 
O l e g ©   (2004-09-04 04:15) [3]

Oxone, она не запускается!(Иногда) В том то и дело. Что не конкретном месте, если бы в конкреном проблем бы не было, чего нибудтьпридумал бы. И главное точно не проверишь исправил или нет: она то в основном работает, но иногда по праздникам буянит!!!!!


 
Юрий Зотов ©   (2004-09-04 11:53) [4]

> O l e g ©   (04.09.04 04:15) [3]

> она не запускается!(Иногда) В том то и дело. Что не конкретном
> месте, если бы в конкреном проблем бы не было, чего
> нибудтьпридумал бы.

А разве нельзя запустить программу под отладчиком и посмотреть, где она вылетает? А заодно посмотреть и стек вызовов - повторяющаяся последовательность функций в нем укажет на рекурсию (что у Вас, похоже, и происходит, но по каким-то причинам не всегда).


 
DrPass ©   (2004-09-04 11:59) [5]


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

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


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

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


 
O l e g ©   (2004-09-05 19:28) [7]

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


 
O l e g ©   (2004-09-05 19:33) [8]

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


 
SammIk ©   (2004-09-05 20:25) [9]

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


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

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


 
O l e g ©   (2004-09-06 03:53) [11]

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


 
O l e g ©   (2004-09-06 03:56) [12]

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


 
TUser ©   (2004-09-06 06:35) [13]

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

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


 
SammIk ©   (2004-09-06 08:49) [14]

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


 
TUser ©   (2004-09-06 08:54) [15]

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


 
©   (2004-09-06 12:35) [16]

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


 
O l e g ©   (2004-09-07 01:50) [17]

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


 
O l e g ©   (2004-09-07 01:52) [18]

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


 
Defunct ©   (2004-09-07 03:24) [19]

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

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

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


 
O l e g ©   (2004-09-08 03:14) [20]

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


 
Defunct ©   (2004-09-08 03:47) [21]

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

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

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

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

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

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

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

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


 
Ihor Osov'yak ©   (2004-09-08 13:47) [22]

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

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


 
Ihor Osov'yak ©   (2004-09-08 14:04) [23]

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

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


 
GuAV ©   (2004-09-08 20:04) [24]


> в принцыпе

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.032 c
1-1094844671
Viking
2004-09-10 23:31
2004.09.26
Assembler


14-1094725109
stud
2004-09-09 14:18
2004.09.26
хороший программист 1С


6-1090163874
banderas
2004-07-18 19:17
2004.09.26
net send


1-1094627427
Gepard
2004-09-08 11:10
2004.09.26
TOpenDialog


1-1094589457
ilop
2004-09-08 00:37
2004.09.26
Масссссивы в record





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский