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. А что, вам нужно из программы следить за остатком? Чтобы предотвратить авост? Это можно доделать на основе того, что есть; однако в Линуксе это - эвристика и гадание на кофейной гуще. В мире Линуса точно узнать размер стека - слишком сложная задача, они еще не дошли до этого. Но беспокоиться нет причин: есть прекрасная библиотечка, которая весьма точно угадывает на большинстве платформ! |
Автор: | 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/ |