我试图编译在HP-UX 1.9.1-P0。一个小的变化,以分机/ pty.c后编译成功,尽管有一个很多警告消息的(大约5K)。当运行使用“使测试”自检崩溃,并用下面的错误核心转储:

  

SENDSIG: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
有帮助吗?

解决方案

回答我的问题:

的问题是,被分配堆栈太小了。所以这真的是一个堆栈溢出。所述SENDSIG()函数被制备上下文结构来从内核空间被复制到用户空间。所述useracc()函数检查有一个在指定的地址足够的空间来这样做。

在1.9.1-P0代码使用PTHREAD_STACK_MIN来分配堆栈创建的任何线程。根据HP-UX文件,有关安腾这是256KB,但是当我检查了头文件,它只是4KB。从useracc()中的错误消息表示,它试图复制20KB。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top