如何诊断/追踪“sentig:useracc失败”。 HP-UX中的问题

时间:2009-04-04 16:17:30

标签: ruby hp-ux yarv

我正在尝试在HP-UX上编译Ruby 1.9.1-p0。在对ext / pty.c进行少量更改后,它会成功编译,尽管有批次的警告消息(大约5K)。当我使用“make test”运行自检时,崩溃和核心转储会出现以下错误:

  

sentig:useracc失败了。 0x9fffffffbf7dae00 0x00000000005000

     

Pid 3044由于写入信号上下文失败而被杀死 - 可能是堆栈溢出。

     

非法指导

通过Google搜索此问题,非法指令只是系统用来杀死进程的信号,与问题无关。在调用信号处理程序时,似乎重新建立上下文存在问题。在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 :(得分:0)

回答我自己的问题:

问题在于分配的堆栈太小。所以它真的是堆栈溢出。 sentig()函数正在准备一个从内核空间复制到用户空间的上下文结构。 useracc()函数检查指定的地址是否有足够的空间来执行此操作。

Ruby 1.9.1-p0代码使用PTHREAD_STACK_MIN为创建的任何线程分配堆栈。根据HP-UX文档,在Itanium上这是256KB,但是当我检查头文件时,它只有4KB。来自useracc()的错误消息表明它正在尝试复制20KB。

因此,如果一个线程收到一个信号,它将没有足够的空间来接收其堆栈上的信号上下文。