2009-04-04 12 views
0

HP-UXでRuby 1.9.1-p0をコンパイルしようとしています。 ext/pty.cを少し変更した後、警告メッセージ(約5K)のがであるにもかかわらず正常にコンパイルされます。私が使用してセルフテストを実行すると、「テストをする」それがクラッシュし、次のエラーでコア・ダンプ:不正な命令は、システムがプロセスを殺すために使用するだけの信号である。この問題をグーグルから診断/トレース方法 "sendsig:useracc failed" HP-UXの問題

sendsig: useracc failed. 0x9fffffffbf7dae00 0x00000000005000

Pid 3044 was killed due to failure in writing the signal context - possible stack overflow.

Illegal instruction

、問題には関係しません。シグナルハンドラを呼び出すときにコンテキストを再確立することに問題があるように見えます。コアを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

問題が割り当てられてスタックが小さすぎたということでした。だから、本当にスタックオーバーフローでした。 sendsig()関数は、カーネル空間からユーザ空間にコピーされるコンテキスト構造を準備していました。 useracc()関数は、指定されたアドレスに十分なスペースがあることを確認します。

Ruby 1.9.1-p0コードは、作成されたすべてのスレッドにPTHREAD_STACK_MINを使用してスタックを割り当てていました。 HP-UXのドキュメントによると、Itaniumでは256KBですが、ヘッダーファイルを確認するとわずか4KBでした。 useracc()からのエラーメッセージは、20KBをコピーしようとしていることを示しています。

スレッドがシグナルを受信した場合、そのシグナルコンテクストをそのスタックに受信するのに十分なスペースがありません。

関連する問題