代码之家  ›  专栏  ›  技术社区  ›  graza

如何诊断/跟踪“sendsig:useracc failed.”HP-UX中的问题

  •  0
  • graza  · 技术社区  · 17 年前

    我正在尝试在HP-UX上编译Ruby1.9.1-p0。在对ext/pty.c做了小改动后,它成功编译,尽管 许多 警告信息(约5公里)。当我使用“make test”运行自测时,它崩溃,核心转储,并出现以下错误:

    sendsig:useracc失败。0x9fffffbf7dae00 0x00000000000.5万

    由于写入信号上下文失败(可能堆栈溢出),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 回复  |  直到 17 年前
        1
  •  0
  •   graza    17 年前

    回答我自己的问题:

    问题是要分配的堆栈太小。所以它实际上是一个堆栈溢出。sendsig()函数正在准备将上下文结构从内核空间复制到用户空间。函数的作用是:检查指定地址是否有足够的空间。

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

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

    推荐文章