ようやく不可解なメモリ関連の原因が特定できそうな気がしてきた。
現状、同じCygwinで起きる場合と起きない場合があった。今までどちらも同じ環境でビルドしていると思っていたが実は違った。片方はGCのDLLを使っていて、もう片方は静的リンクしてた。DLLの方はメモリを壊さないけど、静的リンクは壊していた。
今までメインのDLLにGCが入っていればモジュールとして呼ばれるDLLはリンクしなくてもいいと思っていたがそうでもないのだろうか?
ちょっと調査しよう。
なんでロードされたDLLがGC対象外領域になるんだろう?さっぱり分からん。
とりあえず、Windows以外の環境でBoehmGCが入ってなかったら動的ライブラリでインストールするようにメッセージ出せばいいだろうか?
静的リンクだから、それぞれのdllとexeにGCがくっつくイメージなんだろうか?中身はよく分かっていないのだが。
とりあえずGaucheがどうしてるかを見たら、-lgcというフラグはなく、libgaucheがgcを取り込んでる感じだった。なるほど、それでBoehmGCがバンドルされてるのか。
仮に上記の推測が正しいと仮定するとGaucheのようにメインのランタイムにGCを取り込む必要がある。けど、それをやるにはGC自体をバンドルしないと不可能だし、プラットフォームにくっついてるGCを使いたい場合に困る。(そんな場合があるのかは知らないけど)。じゃあDLLにしてしまえばいいかというと、ビルドする環境がDLL持っているかは分からないからそれも微妙だ。
正直どうしたらいいのか分からない状態になってる。
問題を整理しよう。
何が問題か?
GCが回収ミスをするように見える。見えてる感じだと、モジュールで確保されたメモリがメインのランタイムのヒープを見ないので回収される。
どうすれば解決できるか?
上記の仮定が正しいとして、モジュールとメインランタイムが使うGCを同じものにする。
それって既存のGCがあった場合に可能か?
分からない。そんな感じのリンカーオプションがあるといいなぁ。
最悪Gauche方式だろうか。可能な限り避けたいが・・・
No comments:
Post a Comment