OberonCore
https://forum.oberoncore.ru/

#035: Определение StackOverflow в Linux
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6613
Страница 1 из 1

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

Антон Дмитриев на основе заготовки Александра Ширяева добавил отслеживание переполнения стека.
Добавляю эту тему, чтобы закрепить номер 035 для документации.

Автор:  Info21 [ Суббота, 16 Май, 2020 22:48 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

То есть можно из программы следить за остатком?

Автор:  adimetrius [ Воскресенье, 17 Май, 2020 02:06 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

Info21 писал(а):
То есть можно из программы следить за остатком?

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

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

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

Автор:  Comdiv [ Воскресенье, 17 Май, 2020 14:29 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

Можно сделать своё, а не системное ограничение? Чтобы была ясность.

Автор:  adimetrius [ Воскресенье, 17 Май, 2020 21:04 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

Comdiv писал(а):
Можно сделать своё, а не системное ограничение? Чтобы была ясность.

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

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

Автор:  Comdiv [ Воскресенье, 17 Май, 2020 21:55 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

adimetrius писал(а):
на второй - надо править компилятор, чтобы, например, BEGIN послеживал за стеком..
Неизвестности со стеком от того, что память на него выделяется по мере роста через восстановление после "page fault". Нельзя ли вклиниться сюда? Тогда не нужно править компилятор

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

Автор:  Comdiv [ Воскресенье, 17 Май, 2020 22:19 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

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

Автор:  Илья Ермаков [ Воскресенье, 17 Май, 2020 23:18 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

Насколько я знаю по Винде, там стоит перехватчик обращения на первую страницу ниже адресом, чем последняя уже выделенная.

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

Автор:  Info21 [ Воскресенье, 17 Май, 2020 23:58 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

adimetrius писал(а):
Info21 писал(а):
То есть можно из программы следить за остатком?
Нет, нельзя, можно только авост получить вместо segmentation fault core dumped.

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

Автор:  adimetrius [ Понедельник, 18 Май, 2020 00:52 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

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


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

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

Автор:  adimetrius [ Понедельник, 18 Май, 2020 01:05 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

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

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

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

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

Автор:  adimetrius [ Понедельник, 18 Май, 2020 01:07 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

Илья Ермаков писал(а):
Насколько я знаю по Винде, там стоит перехватчик обращения на первую страницу ниже адресом, чем последняя уже выделенная.


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

Автор:  Comdiv [ Понедельник, 18 Май, 2020 01:42 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

adimetrius писал(а):
А пришлите ваши тестовые примеры, пож, попробовать. У меня бесконечная рекурсия, с большими кадрами и не очень, благополучно останавливается авостом.
Я пробовал на простейшей Си программе. Просто чтобы посмотреть на воспроизводимость границы.

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

Автор:  Илья Ермаков [ Понедельник, 18 Май, 2020 01:45 ]
Заголовок сообщения:  Re: #035: Определение StackOverflow в Linux

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


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

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/