Ключевые слова:memory, malloc, stack, debug, (найти похожие документы)
Date: Sun, 21 Apr 2002 21:30:27 +0000 (UTC)
From: "Valeriy E. Ushakov" <uwe@ptc.spbu.ru>
Newsgroups: fido7.ru.unix.bsd
Subject: Почему падают программы при жестком ограничении размера стека
> VEU> А как проверить, что ты в stack limit уперся? Программа честно
> VEU> двигает sp, и думает, что у нее есть N байт на фрейм, хотя их у нее
> VEU> всего лишь до конца последней страницы, а больше не дадут.
>
> RETURN VALUES
> The malloc() and calloc() functions return a pointer to the allocated
> space if successful; otherwise, a null pointer is returned and errno is
> set to ENOMEM.
Программа имеет, скажем, 512К лимит на размер стека. Программа
выжрала, ну скажем, 511K. Она вызывает функцию, которой под локальные
переменные надо, ну пусть, 2К. Пролог функции создает новый call
frame, передвинув %sp/%fp, код функции обращается к переменнным по
смещениям от регистра. Обращается к одной переменной, которая ниже
512К - все ок. Обращается к другой переменной, которая вылезает за эти
512К на следующую страницу... оппаньки, стек уперся в лимит, новой
страницы ядро под стек не дает. Программа умирает.
Реальный пример - сборка clisp на NetBSD/sparc дохнет в bootstrap'е
именно по этой причине.
Кстати, вот где был неправ - так в непоквоченной тобой гипотезе про
malloc - там sbrk(), упершись в лимит, обломится с ENOMEM. Но malloc,
явно просит себе новый кусок арены и может проверить код возврата. А
вот стек функции дается программе ядром автомагически, явочным, так
сказать порядком.