Как диагностировать / отследить "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 КБ.
Поэтому, если поток получил сигнал, у него не было бы достаточно места для получения контекста сигнала в своем стеке.