Как диагностировать / отследить «sendig: ошибка useracc». проблема в HP-UX - PullRequest
0 голосов
/ 04 апреля 2009

Я пытаюсь скомпилировать Ruby 1.9.1-p0 на HP-UX. После небольшого изменения в ext / pty.c он успешно компилируется, хотя с lot предупреждающих сообщений (около 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 Ответ

0 голосов
/ 08 апреля 2009

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

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

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

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

...