LINUX.ORG.RU

Релиз bike 0.13.0. Нужна помощь с сигналами на линуксе. Опять.

 , , , ,


0

1

После пары лет наконец выпустил новый релиз своей библиотеки для интероперабельности Common Lisp и .NET

https://github.com/Lovesan/bike/tree/0.13.0

Там есть серьезная issue, касающаяся линукса, с которой вообще нужна была бы помощь. Что-то опять с сигналами не так, на этот раз с SIGFPE.

https://github.com/Lovesan/bike/issues/10

Если для Ъ - после загрузки рантаймов последних версий .NET в лисп(тестировал на SBCL и CCL), лисповый процесс грохается с SIGFPE.

Выглядит это обычно примерно так:

CORRUPTION WARNING in SBCL pid 151 tid 163:
Received signal 8 @ 7f00cbeb2c3b in non-lisp tid 163, resignaling to a lisp thread.
The integrity of this image is possibly compromised.
Continuing with fingers crossed.
Floating point exception (core dumped)

Началось такое с релиза .NET 6 и продолжается до сих пор. Т.е. .NET 5 работает, и .Net Core до него работали тоже.

Проблемы с сигналами на линуксе уже раньше были(так и хочется сказать - потому что сигналы это кривое говно by design), но мы с одним из разработчиков SBCL их закостылили - переписываем дотнетовские сигналы лисповыми, кроме тех которые дотнет нормально обрабатывает.

Для SBCL и в этот раз есть костыль, правда, кривой. Вырубить отлов исключений операций с плавающей точкой. Но тогда, вместо вызова исключений, в случае операций по типу (/ 1.0 0.0) будут возвращаться значения типа +inf, -inf, и всякие там NaN. Что вобщем-то не по стандарту CL и вообще криво.

Возможен ли подобный костыль для CCL и других реализаций - непонятно. Как и непонятно, что вообще в дотнете сломали и поменяли. Сорцы я его смотрел, но они ужасны, огромны, и написаны как говно, особенно в низкоуровневой области, там где C++, работа с ОС и вот это вот все.

★★

Ответ на: комментарий от VKraft

Ну, до .NET 6 то такого не было и нет(там другое было, тоже с сигналами, но вроде закостылили).

И скармливаться ему особо на момент краша не скармливается. Хотя… зависит. Например, если отрубить перехват исключений с флоатами на момент подгрузки донета в лисп - то все окей, а если потом включить - то ошибка может возникнуть в рандомном месте, поэтому у меня такое ощущение что это происходит где-то в треде финалайзера или GC, или вообще в JIT. Вобщем, в стороннем треде, о чем собственно и говорит ошибка в SBCL.

Кстати, методом научного тыка выяснилось, что float trap возникает не простой, и не из-за деления на нуль, а только, и именно только - из-за операции с NaN.

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

Я вот единственное что нашел пока в сорцах дотнета и вообще что они там меняли на этом низком уровне - это значит, они на юниксах и юникс-подобных системах разрешили пользователю(ну тому который на C# допустим пишет), самому ставить обработчики сигналов. Но код сложный и его много, пока толком понять ниче не могу.

lovesan ★★
() автор топика
Ответ на: комментарий от lovesan

Я-бы посмотрел в сторону обработчика этого сигнала в .Net. Есть вероятность что это норма для него в новом релизе получать изредка SIGFPE и как-то реагировать(с бОльшей вероятность в JIT). Хотя это пальцем в небо и такое не должно быть нормой, но кто его знает. Больше идей нет.

VKraft ★★
()
Ответ на: комментарий от blex

Ну открыть то можно - только ничего особо там не видно, естественно. Потому что там два managed рантайма, с GC и прочим, оба компилирующие в нейтив в прямо рантайме(SBCL напрямую, CLR - через JIT) причем.

lovesan ★★
() автор топика