Как диагностировать / отследить "sendig: ошибка useracc". проблема в HP-UX

Я пытаюсь скомпилировать Ruby 1.9.1-p0 на HP-UX. После небольшого изменения в ext/pty.c он успешно компилируется, хотя и с большим количеством предупреждающих сообщений (около 5 КБ). Когда я запускаю самотестирование с помощью команды "make test", происходит сбой и дамп памяти со следующей ошибкой:

sendig: сбой useracc. 0x9fffffffbf7dae00 0x00000000005000

Pid 3044 был убит из-за ошибки записи контекста сигнала - возможного переполнения стека.

Незаконное обучение

Начиная поиск этой проблемы, незаконная инструкция является просто сигналом, который система использует для уничтожения процесса, и не связана с проблемой. Казалось бы, существует проблема с восстановлением контекста при вызове обработчика сигнала. Загрузка ядра в gdb не показывает особенно глубокого стека, поэтому я не думаю, что "возможное переполнение стека" также является правильным.

Вывод обратной трассировки стека GDB выглядит следующим образом:

#0  0xc00000000033a990:0 in __ksleep+0x30 () from /usr/lib/hpux64/libc.so.1
#1  0xc0000000001280a0:0 in __mxn_sleep+0xae0 ()
    from /usr/lib/hpux64/libpthread.so.1
#2  0xc0000000000c0f90:0 in <unknown_procedure> + 0xc50 ()
    from /usr/lib/hpux64/libpthread.so.1
#3  0xc0000000000c1e30:0 in pthread_cond_timedwait+0x1d0 ()
    from /usr/lib/hpux64/libpthread.so.1

1 ответ

Решение

Отвечая на мой собственный вопрос:

Проблема заключалась в том, что выделяемый стек был слишком маленьким. Так что это действительно было переполнение стека. Функция sendig() подготавливала структуру контекста для копирования из пространства ядра в пространство пользователя. Функция useracc() проверяет, достаточно ли места по указанному адресу для этого.

Код Ruby 1.9.1-p0 использовал PTHREAD_STACK_MIN для выделения стека для любых созданных потоков. Согласно документации HP-UX, на Itanium это 256 КБ, но когда я проверял заголовочные файлы, это было только 4 КБ. Сообщение об ошибке от useracc() указывает на то, что он пытается скопировать 20 КБ.

Поэтому, если поток получил сигнал, у него не было бы достаточно места для получения контекста сигнала в своем стеке.

Другие вопросы по тегам