2005/11/01
う〜。0.8.6リリース寸前にもたついている。
どうもメモリ絡みのやばいバグが潜んでる模様。 び?さんのレポートするMacOS X最新版での不具合もひょっとすると同根かも。 これまでの経過。
- こっちでテストできるプラットフォームのほとんどでテストは通ってるのだけれど、 SolarisでのテストがAssertion failedで落ちることが発覚。
- dlopenされるモジュール中のScmIdentifierであるべきオブジェクトが 全然違うオブジェクトに化けているので、gc絡みだろう
- root setの登録ミスをまず疑うが、値をダンプしたりScm_GCSentinelを 使ったりして調べてみると、 「root setとして登録されているアドレス範囲から参照されているにも かかわらず、GCされている」ことが発覚。gcのバグを疑い、gc/ 以下に突入。
- mark_rts.c, mark.c, os_dep.c と読んで、「root setに登録されているが、 ページに一度もdirty bitが立ったことがないことになっているのでmarkされていない」 ことが発覚。dirty bitはOSから得ているのに、おかしいぞ? OSのバグの可能性は低い…
- 「一度でもdirty bitが立ったことがある」ページはGC_written_pagesで 管理されている。このビットマップは、一度 '1' になったら決して '0' になることは ない。ところが、問題のページに該当するビットを追っていると、最初はちゃんと '1' になっているのに途中から '0' になっていることが判明。あれれ。
- 念のためビットマップのバックアップをstaticに確保しといて 比較するプローブを組み込んだら、今度はテストが通る。→ちうことは、 GaucheのどっかのコードがGCのデータ領域に間違って書き込んでるっちゅうことじゃん!
さすがにこの爆弾を抱えたまま出すわけにいかないので、引続き調査中。
Tag: Gauche