r4 - 24 Apr 2011 - 20:03:25 - Tonal PromsoftYou are here: TWiki >  Refaldevel Web > FrequentlyAskedQuestions

Рефал-программа, скомпилированная в С++, собирается без ошибок, но не работает. Почему?

Если программа падает с сообщением Segmentation fault (под Linux) или вообще без всяких сообщений (под Windows), то возможно, что ей просто не хватило отведённого по умолчанию стека (имеется в виду системный стек, используемый при вызовах Си-функций). Это особенно вероятно, если программа занимается рекурсивной обработкой больших структур данных.

  • В bash узнать и установить максимальную величину системного стека можно с помощью команды ulimit:
    • ulimit -s   выдаёт текущее ограничение на размер стека (в килобайтах)
    • ulimit -Ss <num>   устанавливает максимальную величину стека в <num> килобайт
    • ulimit -Ss unlimited   снимает ограничение на размер стека (будьте осторожны, циклящаяся рекурсивная программа может быстро израсходовать всю физическую память!)
  • В Windows ограничение на размер стека задаётся при линковке программы. По умолчанию оно равно 1 Mb. Изменить его можно, задав линкеру (link.exe) опцию /STACK:<num>, где <num> — размер стека в байтах. Кроме того, если у вас есть программа editbin, то можно воспользоваться ей для изменения ограничения на стек уже собранной программы, не перекомпилируя её (см. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_editbin_reference.asp).

Пример: самокомпиляция rfpc-2.0. Чем больше размер исходной программы на Рефале, тем больший стек необходим для преобразования её в программу на C++ с помощью rfpc-2.0. Для компиляции самого большого файла из исходников rfpc-2.0 (эта компиляция происходит на второй стадии бутстрапинга, см. Boot Strap? ) — rfp_compile.rf — необходимо, чтобы ограничение на стек было не меньше 8 Mb. Это обеспечивается следующей командой (в bash):
ulimit -Ss 8192.
Либо (в Windows) заданием опции линкера: /STACK:8388608. При использовании rfp.bat, эта опция может быть задана с помощью переменной LFLAGS в файле config.bat, либо в командном шелле (см. Visual Cpp Backend Guide).

? Может быть, имеет смысл установку нужного ограничения на стек включить в Makefile?

-- Anton Orlov - 5 Mar 2005

Кодировки и Рефал.

  1. Можно ли (и как если можно) указать кодировку строк в исходнике?
  2. Можно ли (и как если можно) указать кодировку файла при чтении или записи?
  3. Есть ли механизмы/библиотеки преобразования кодировок для строк?

Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r4 < r3 < r2 < r1 | More topic actions
Refaldevel.FrequentlyAskedQuestions moved from Refaldevel.KnowHow on 05 Mar 2005 - 02:03 by OrloV - put it back
 
R+

This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback