如何诊断/跟踪“SENDSIG:useracc失败。”在HP-UX问题
题
我试图编译在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。
因此,如果一个线程接收到的信号,这将没有足够的空间来接收它的堆栈上的信号的上下文。
不隶属于 StackOverflow