/トレース「sendsigを:useraccに失敗しました。」を診断する方法HP-UXでの問題を
質問
私は、HP-UX上でのRuby 1.9.1-p0とをコンパイルしようとしています。 EXT / 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()関数はこれを行うには指定したアドレスに十分なスペースがあることを確認します。
のRuby 1.9.1-P0コードが作成されたスレッドのスタックを割り当てるPTHREAD_STACK_MINを使用していました。 HP-UXのドキュメントによると、Itaniumではこれは256キロバイトですが、私は、ヘッダファイルをチェックすると、それだけで4キロバイトでした。 useraccからのエラーメッセージは、()は20キロバイトをコピーしようとしていたことが示されます。
スレッドがシグナルを受け取った場合は、だから、それは、そのスタック上の信号コンテキストを受信するための十分なスペースを持っていないでしょう。