20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
1

Исключение типа "System.StackOverfliwException"

10.03.2013, 16:55. Показов 3319. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
В форма есть ТекстБокс и Кнопка. Ввожу текст в бокс, жму кнопку, функция обрабатывает содержимое и очищает бокс textBox2.Clear() таким способом.
В результате на (примерно) 30м нажатии кнопки вылезает ошибка Исключение типа "System.StackOverfliwException" произошло в "System.Windows.Forms.dll".
Подскажите, что не так с моим Боксом и как это исправить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2013, 16:55
Ответы с готовыми решениями:

Необработанное исключение типа "System.Net.Sockets.SocketException" в System.dll
Доброго времени суток! Есть следующая статья: Разработка прокси-сервера на C# В самом конце есть...

Необработанное исключение типа "System.ObjectDisposedException" в mscorlib.dll
Добрый день!Подскажите пожалуйста.Возникает ошибка Необработанное исключение типа...

Потоки Thread: Необработанное исключение типа "System.NullReferenceException"
Такова проблема thrListener = new Thread(KeepListening); thrListener.Start(); ... public...

Необработанное исключение типа "System.Reflection.TargetInvocationException"
Добрых времени суток. Есть асинхронный сервер, к которому подулючается клиент, передает на серв...

21
Эксперт .NET
17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
10.03.2013, 17:01 2
Добрый день.
Гляньте двадцать восьмую строчку, ошибка скорее всего там.
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
10.03.2013, 17:08  [ТС] 3
kolorotur, ТекстБокс раскрыть?

Добавлено через 3 минуты
Раскрываю TextBox, а там во всех строчках значения:
{Text = Невозможно вычислить выражение, поскольку текущий поток находится в состоянии переполнения стека.}
0
Эксперт .NET
17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
10.03.2013, 17:20 4
Вообще это был тонкий намек на то, чтобы вы показали код обработчика кнопки и функции, выполняющей очистку текстбокса.
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
10.03.2013, 17:40  [ТС] 5
kolorotur, саму функцию что ли?
0
Эксперт .NET
17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
10.03.2013, 17:51 6
Ну да, как же еще узнать, где ошибка возникает?
Телепатов здесь нет.
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
10.03.2013, 18:14  [ТС] 7
А так на вскидку не можете предположить в чем причина.
Код не смогу скинуть, приложение большое, многие переменные вне функции расположены, да и используемые функции тоже придется прикладывать...
0
Эксперт .NET
17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
10.03.2013, 18:35 8
Да причин, в общем-то, не много.
Первая, она же самая распространенная — это бесконечная рекурсия. Смотрите где у вас метод вызывает сам себя напрямую или через посредника (например, обработчик события TextChanged изменяет текст контрола, сгенерировавшего это событие).
Вторая причина — попытка выделить в стеке памяти больше, чем имеется. Например, если у вас есть структура общим размером больше 2Мб, которую вы пытаетесь создать как локальную переменную в методе, или у вас количество локальных переменных переваливает за 2Мб. Что, как правило, свидетельствует либо о первой причине, либо о слишком большой вложенности методов (сли-ишком большой).
Еще его можно схлопотать в небезопасном контексте при бездумном использовании stackalloc.
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
10.03.2013, 18:38  [ТС] 9
А может это произойти из-за того, что я рекурсивно произвожу textBox2.Clear()?
0
Эксперт .NET
17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
10.03.2013, 18:40 10
Вполне, см. первую причину.
1
211 / 135 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
11.03.2013, 18:16 11
Цитата Сообщение от kolorotur Посмотреть сообщение
если у вас есть структура общим размером больше 2Мб
Размер стека потока всегда равен 2 метрам? Я почему-то думал, что CLR может назначать этот размер разный... Просто раньше экспериментировал с рекурсией, и обнаружил, что количество вложенных рекурсий до появления StackOverflowException на разных компах разное. То есть, на первом компе одна и та же функция может вызвать сама себя одно количество, а на другом компе количество будет совсем другое. И я тогда предположил, что CLR сама назначает размер стека по каким-то своим алгоритмам в зависимости от мощности железа...
0
Эксперт .NET
17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
11.03.2013, 18:42 12
Цитата Сообщение от Tolias28 Посмотреть сообщение
Размер стека потока всегда равен 2 метрам?
Нет, конечно.
Если мне не изменяет память, то на х86 размер стека по умолчанию равен 1Мб, на х64 — 2Мб.
Более того, его размер можно менять вручную для каждого потока.

Однако, судя по тому, что автор темы не может понять откуда берется ошибка переполнения стека, я предположил, что и размером стека он управлять не умеет, а значит работает со значениями по умолчанию. Отсюда и 2 метра
1
211 / 135 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
11.03.2013, 19:05 13
Цитата Сообщение от kolorotur Посмотреть сообщение
Более того, его размер можно менять вручную для каждого потока
Ну да. В C++ его можно указать параметром в функции CreateThread() или _beginthreadex(), а в шарпе при создании и запуске нового потока его стек по дефолту в коде не указывается, а значит какие-то дефолтные значения размера есть

Добавлено через 8 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
Если мне не изменяет память, то на х86 размер стека по умолчанию равен 1Мб, на х64 — 2Мб.
Когда я тестил, то в моем случае были две 32-разрядные системы XP и семерка. Плюс сильное различие в мощи железа. И размер стека был разным
0
Эксперт .NET
17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
11.03.2013, 19:09 14
Цитата Сообщение от Tolias28 Посмотреть сообщение
И размер стека был разным
Каким методом это замерялось?
0
211 / 135 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
11.03.2013, 19:13 15
Цитата Сообщение от kolorotur Посмотреть сообщение
Каким методом это замерялось?
Количеством вызовов метода самого себя до появления StackOverfliwException...
Согласен, плохой метод, чтобы по нему утверждать о размере стека. Но тогда почему возможное количество вложенных вызовов разное?
0
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
11.03.2013, 19:16 16
Цитата Сообщение от Костяныч Посмотреть сообщение
я рекурсивно произвожу textBox2.Clear()
Простите, что? Мне одному показалось, что это невозможно?
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
11.03.2013, 19:52  [ТС] 17
Цитата Сообщение от Yukikaze Посмотреть сообщение
Простите, что? Мне одному показалось, что это невозможно?
Постоянно крутится функция в которой происходит это действие с боксом....?
0
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
11.03.2013, 20:37 18
Костяныч, это не рекурсия, это цикл. Рекурсия была-бы если бы внутри метода textbox.Clear вызывался бы метод textbox.Clear
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
11.03.2013, 20:47  [ТС] 19
Цитата Сообщение от Yukikaze Посмотреть сообщение
Костяныч, это не рекурсия, это цикл. Рекурсия была-бы если бы внутри метода textbox.Clear вызывался бы метод textbox.Clear
не будим развивать эту тему)))
0
NickoTin
11.03.2013, 21:42     Исключение типа "System.StackOverfliwException"
  #20

Не по теме:

Tolias28, по умолчанию размер резервируемого пространства для стека составляет 1 мб для x86 и 4 мб для x64 (характерно для .NET PE). Эти значения задаются линкером по умолчанию в PE заголовке при сборке: структура IMAGE_OPTIONAL_HEADER поле SizeOfStackReserve.

Почему разные значения в Вашем "тестировании"? Предположу что погрешность вносит CLR и пр. сервисы .NET'а, контролировать которые Вы не в силе.

1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2013, 21:42

Необработанное исключение типа "System.IO.IOException" произошло в mscorlib.dll
Ребят подскажите проблему при сохранение через SaveFileDialog() выдает ошибку: Необработанное...

Выдано исключение типа "System.OutOfMemoryException"
Доброго времени суток. Есть приложение, периодически (довольно редко) ловлю Unhandled Exception...

Выдано исключение типа "System.OutOfMemoryException"
Добрый день. Подскажите, пожалуйста, как бороться с исключением System.OutOfMemoryException?...

Неявное преобразование типа "System.Drawing.Icon" в "System.Drawing.Image" невозможно
ПОдскажите как можно вставить рисунок в панель если использую ico. Неявное преобразование типа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru