Как диагностировать/отслеживать «sendsig:UserAcc не удалось. Проблема в HP-UX

StackOverflow https://stackoverflow.com/questions/717327

  •  23-08-2019
  •  | 
  •  

Вопрос

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

посыл:Ошибка пользователя.0x9ffffffbf7dae00 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
Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top