0

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

发送信号: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
4

1 回答 1

0

回答我自己的问题:

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

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

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

于 2009-04-08T13:22:35.237 回答