Я пытаюсь завернуть маленький библиотека, которую я написал в с, и я думаю, что я нахожусь дома, чтобы заставить это работать. В библиотеке есть несколько довольно надежных тестов, и я провел ее через valgrind, чтобы устранить любые утечки памяти и явные проблемы. Это работает довольно солидно само по себе.
Тем не менее, когда я пытаюсь обернуть его, используя ruby, это segfaults. Вот пример проекта это оборачивает библиотеку. Когда тесты в этом проекте выполняются, вызов библиотеки segfaults. Запуск его приводит к аварийному завершению работы ядра, которое я загрузил в gdb для отладки, но я не уверен, что не так. Дамп ядра говорит, что проблема на этой линии, но я понятия не имею, что является причиной этого, поскольку предоставленная информация довольно скудна, и код работает хорошо, если я запускаю тесты в c land.
Строка, которую говорит дамп ядра, это segfaulting:
assert( yypParser->yytos!=0 );
Вы можете воспроизвести его, запустив rake
из корневого каталога, который запускает процесс, который в конечном итоге генерирует общий объект, который загружается тестами. Я надеюсь, что кто-то с большим опытом в c может взглянуть и потенциально направить меня в правильном направлении.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Фрагмент из основного дампа:
#0 0x00007f150caa2c37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1 0x00007f150caa6028 in __GI_abort () at abort.c:89
#2 0x00007f150dba8d8d in die () at error.c:407
#3 rb_bug_context (ctx=ctx@entry=0x7f150f3b1b80, fmt=fmt@entry=0x7f150dbe2f6a "Segmentation fault at %p") at error.c:437
#4 0x00007f150daa45ce in sigsegv (sig=<optimized out>, info=0x7f150f3b1cb0, ctx=0x7f150f3b1b80) at signal.c:890
#5 <signal handler called>
#6 0x00007f150b96b02b in Parse (yyp=0xf9925e0, yymajor=20, yyminor=..., state=0x7ffe17b6a3a0) at parser.c:1919
#7 0x00007f150b96b8e8 in numerize (data=data@entry=0x7f150b96c1aa "one", state=state@entry=0x7ffe17b6a3a0) at ../../../../ext/example_project/fast_numerizer/fast_numerizer.c:102
#8 0x00007f150b960e0b in example_project_c_code_function () at ../../../../ext/example_project/./example_project.c:11
Задача ещё не решена.
Других решений пока нет …