2013年7月4日木曜日

0xF 0xB 0x31 0xFF

app-admin/eselect-1.3.5 問題の続き。

一応復習しておこう。 PORTAGE_ELOG_COMMAND で呼び出された gentwoo が eselect を呼び出したところで死ぬ。 環境変数を gentwoo に引き渡しておけば死なない。

Gentoo Bugs #475284 に報告してみて得た情報なども加味しながらもう少し情報を補足しよう。 環境変数が空っぽだと死ぬので env -i /path/to/eselect とすればいつでも再現できる、と主張したのだが、 これで現象が再現できるのは(少なくとも今のところは)私の Gentoo Prefix on OS X でだけである。 そもそも、eselect は bash スクリプトで、死んでいるのは具体的にどこなのか、と聞かれて core を吐かせることにする。 ulimit -c unlimited としておく(と core ファイルは /cores に core.PID という名前で残される)。

死んでいるのは bash の中だ。

bash 自体が死ぬような現象には遭遇した経験が無かったので、どうにもデバッグの糸口が摑めなかった。 とりあえず eselect の中に echo コマンドをいくつか挟んでみた。 どうも死ぬ場所は一定していないらしい(埋め込んだ echo が実行される前に死んだり、実行してから死んだりまちまち)。 とすると、むしろメモリーのゴミを踏んでしまっているか?

メモリーエラーには valgrind。 ここでも環境変数を渡さないように env -i /path/to/valgrind /path/to/bash /path/to/eselect。 すると次のような出力を得る

vex x86->IR: unhandled instruction bytes: 0xF 0xB 0x31 0xFF
==64989== valgrind: Unrecognised instruction at address 0x2a5ce9.
==64989==    at 0x2A5CE9: _dispatch_mgr_invoke (in /usr/lib/libSystem.B.dylib)
==64989==    by 0x2A4F58: _dispatch_queue_invoke (in /usr/lib/libSystem.B.dylib)
==64989==    by 0x2A4CFD: _dispatch_worker_thread2 (in /usr/lib/libSystem.B.dylib)
==64989==    by 0x2A4780: _pthread_wqthread (in /usr/lib/libSystem.B.dylib)
==64989==    by 0x2A45C5: start_wqthread (in /usr/lib/libSystem.B.dylib)
==64989== Your program just tried to execute an instruction that Valgrind
==64989== did not recognise.  There are two possible reasons for this.
==64989== 1. Your program has a bug and erroneously jumped to a non-code
==64989==    location.  If you are running Memcheck and you just saw a
==64989==    warning about a bad jump, it's probably your program's fault.
==64989== 2. The instruction is legitimate but Valgrind doesn't handle it,
==64989==    i.e. it's Valgrind's fault.  If you think this is the case or
==64989==    you are not sure, please let us know and we'll try to fix it.
==64989== Either way, Valgrind will now raise a SIGILL signal which will
==64989== probably kill your program.
==64989==
==64989== Process terminating with default action of signal 4 (SIGILL)
==64989==  Illegal opcode at address 0x2A5CE9
==64989==    at 0x2A5CE9: _dispatch_mgr_invoke (in /usr/lib/libSystem.B.dylib)
==64989==    by 0x2A4F58: _dispatch_queue_invoke (in /usr/lib/libSystem.B.dylib)
==64989==    by 0x2A4CFD: _dispatch_worker_thread2 (in /usr/lib/libSystem.B.dylib)
==64989==    by 0x2A4780: _pthread_wqthread (in /usr/lib/libSystem.B.dylib)
==64989==    by 0x2A45C5: start_wqthread (in /usr/lib/libSystem.B.dylib)
==64989== 

何度か実行してみたが、毎回同じ結果のようだ。 0xF 0xB 0x31 0xFF って何? しかも libSystem.B.dylib (OS X おける libc みたいなもの)の中って。

今回は何も解決しない。