0

HP-UX で Ruby 1.9.1-p0 をコンパイルしようとしています。ext/pty.c に小さな変更を加えた後、多くの警告メッセージ (約 5K) が表示されますが、正常にコンパイルされます。「make test」を使用してセルフテストを実行すると、クラッシュし、次のエラーでコアダンプします。

sendig: 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
4

1 に答える 1

0

私自身の質問に答える:

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

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

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

于 2009-04-08T13:22:35.237 に答える