我正在尝试在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
答案 0 :(得分:0)
回答我自己的问题:
问题在于分配的堆栈太小。所以它真的是堆栈溢出。 sentig()函数正在准备一个从内核空间复制到用户空间的上下文结构。 useracc()函数检查指定的地址是否有足够的空间来执行此操作。
Ruby 1.9.1-p0代码使用PTHREAD_STACK_MIN为创建的任何线程分配堆栈。根据HP-UX文档,在Itanium上这是256KB,但是当我检查头文件时,它只有4KB。来自useracc()的错误消息表明它正在尝试复制20KB。
因此,如果一个线程收到一个信号,它将没有足够的空间来接收其堆栈上的信号上下文。