OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 19:47

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Суббота, 16 Май, 2020 21:00 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Антон Дмитриев на основе заготовки Александра Ширяева добавил отслеживание переполнения стека.
Добавляю эту тему, чтобы закрепить номер 035 для документации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Суббота, 16 Май, 2020 22:48 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
То есть можно из программы следить за остатком?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Воскресенье, 17 Май, 2020 02:06 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Info21 писал(а):
То есть можно из программы следить за остатком?

Нет, нельзя, можно только авост получить вместо segmentation fault core dumped.

А что, вам нужно из программы следить за остатком? Чтобы предотвратить авост?

Это можно доделать на основе того, что есть; однако в Линуксе это - эвристика и гадание на кофейной гуще. В мире Линуса точно узнать размер стека - слишком сложная задача, они еще не дошли до этого. Но беспокоиться нет причин: есть прекрасная библиотечка, которая весьма точно угадывает на большинстве платформ! :wink:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Воскресенье, 17 Май, 2020 14:29 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Можно сделать своё, а не системное ограничение? Чтобы была ясность.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Воскресенье, 17 Май, 2020 21:04 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Comdiv писал(а):
Можно сделать своё, а не системное ограничение? Чтобы была ясность.

Хм, интересная мысль... но кажется, что с Линуксом все равно ж придется договариваться. На первый взгляд, невозможно, на второй - надо править компилятор, чтобы, например, BEGIN послеживал за стеком.. К тому же стек может подрастать иногда, когда Линукс решит. А когда не решит - будет падать процесс.

Но точно можно сделать какой-нибудь "щуп": он будет не точным, но сигнализировать, например, что стек в "желтой зоне", или красной. Если какое-то стеконагруженное приложение есть, оно может этим щупом пользоваться, чтобы предотвратить авост, выдать, напр, сообщение "купите памяти в дээнэсе". Но зависаниям типа бесконечной рекурсии только перехватчик сигналов поможет, который сделан.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Воскресенье, 17 Май, 2020 21:55 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
adimetrius писал(а):
на второй - надо править компилятор, чтобы, например, BEGIN послеживал за стеком..
Неизвестности со стеком от того, что память на него выделяется по мере роста через восстановление после "page fault". Нельзя ли вклиниться сюда? Тогда не нужно править компилятор

Ну а если надо следить за стеком вручную, то не так уж и важно, что мы не знаем ограничения сверху, достаточно знать ограничение снизу


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Воскресенье, 17 Май, 2020 22:19 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Попробовал бесконечную рекурсию - падает всё время при разной вложенности, но не радикально. Для надёжного ограничения снизу подойдёт, если только дело не в верхней границы, а в разном расходе памяти стека для одного и того же уровня вложенности.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Воскресенье, 17 Май, 2020 23:18 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Насколько я знаю по Винде, там стоит перехватчик обращения на первую страницу ниже адресом, чем последняя уже выделенная.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Воскресенье, 17 Май, 2020 23:58 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
adimetrius писал(а):
Info21 писал(а):
То есть можно из программы следить за остатком?
Нет, нельзя, можно только авост получить вместо segmentation fault core dumped.

А что, вам нужно из программы следить за остатком? Чтобы предотвратить авост?
До сих пор не приходило в голову, но раз оно обозначено, то хочется понять, мало ли.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Понедельник, 18 Май, 2020 00:52 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Comdiv писал(а):
Попробовал бесконечную рекурсию - падает всё время при разной вложенности, но не радикально. Для надёжного ограничения снизу подойдёт, если только дело не в верхней границы, а в разном расходе памяти стека для одного и того же уровня вложенности.


Падает в смысле: авост stack overflow, или segmentation fault core dumped?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Понедельник, 18 Май, 2020 01:05 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Comdiv писал(а):
adimetrius писал(а):
на второй - надо править компилятор, чтобы, например, BEGIN послеживал за стеком..
Неизвестности со стеком от того, что память на него выделяется по мере роста через восстановление после "page fault". Нельзя ли вклиниться сюда? Тогда не нужно править компилятор

Увы, не только и не столько от этого. Просто НЕТУ системного вызова, который бы отвечал на вопрос: каковы границы стека в данный момент. В разных системах сделано по-разному, и в их мире все пользуются библиотечкой; в ней ifdef на define сидит и undefом погоняет.

Как я понял, там где-то в недрах системы устанавливаются "типовые границы" адресного пространства стека для процесса, и по мере поступления Page fault'ов к этом пространству подключаются новые странички памяти; это делает ядро ОС, а наше ядро даже не подозревает об этом. А вот когда исчерпывается адресное пространство, тогда и прилетает segmentation fault, который ловится в нашем ядре и обрабатывается (на альтернативном стеке - главный-то исчерпан).

Как узнать, какие у моего процесса границы адресного пространства стека - никак; как попросить систему раздвинуть эти границы - не знаю, не нашел. И опять же, у них там есть чудо библиотечка, они ее подключают и не парятся. Теоретически, и нам не возбраняется ее подключить, но я решал задачу в рамках: имеющимися средствами. И, полагаю, она и не нужна нам - бесконечная рекурсия должна умереть на столе разработчика, а для этого достаточно эвристики, которая предотвращает смерть процесса и выдает авост.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Понедельник, 18 Май, 2020 01:07 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Илья Ермаков писал(а):
Насколько я знаю по Винде, там стоит перехватчик обращения на первую страницу ниже адресом, чем последняя уже выделенная.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Понедельник, 18 Май, 2020 01:42 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
adimetrius писал(а):
А пришлите ваши тестовые примеры, пож, попробовать. У меня бесконечная рекурсия, с большими кадрами и не очень, благополучно останавливается авостом.
Я пробовал на простейшей Си программе. Просто чтобы посмотреть на воспроизводимость границы.

adimetrius писал(а):
Просто НЕТУ системного вызова, который бы отвечал на вопрос: каковы границы стека в данный момент. В разных системах сделано по-разному, и в их мире все пользуются библиотечкой; в ней ifdef на define сидит и undefом погоняет.
Не копал в сторону системных вызовов, но узнавал и задавал размер стека командой "ulimit (-Ss|-Hs) [размер]" - работало. На моей системе по умолчанию soft - 8 MiB, hard - unlimited.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #035: Определение StackOverflow в Linux
СообщениеДобавлено: Понедельник, 18 Май, 2020 01:45 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
adimetrius писал(а):
Наверное, все-таки нехорошо иметь возможность бесконечно добавлять к стеку; это ведь бесконечная рекурсия чаще всего, ее лучше отловить и остановить, чем "подкладывать" ей новые странички.


Так по идее оно всегда так работает. Сразу весь лимит стека не выделяется физически. Делается VirtualAlloc(резервировать адреса), а потом уже по мере надобности по одной страничке VirtualAlloc(отобразить физически).

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB