他所で落ちないのにウチでは落ちる

時間無いので簡潔に纏めると、

ただ、想定できる原因がめちゃくちゃ多い。そもそもこれらの不思議な現象がすべて同じ原因とも言い切れない。

しかもリビジョンによっては死なない。
マルチスレッドにしてVM間でオブジェクトを交換しまくるとよく落ちるが、これまた別の要因(そもそもVMクラスがスレッドセーフでない)という可能性も有るのでなんとも言えない。
こういう場合はどこから手をつけるのが正しいのだろうなぁ。。
まぁ大抵の場合は、起きてそうなことから手をつけるのが正しい。つまり、

  • リアライザ(やコンパイラ)を他のSchemeに移植して両方で結果を検証するようなのを作る
    • (とにかく何か信頼できるポイントが必要。)
  • リアライザが生成したFASLバイナリが正しいかを検証する
    • (どうするんだろう)
  • シリアライズしたライブラリは一切使わないで問題が再現するかを試す
    • (同上)
  • GCを無効にしてValgrindしてメモリエラーを探す
    • moshGC_INIT前にgc_*を呼ぶのでValgrindでは動かない*2からそこを修正しないと。。(そして普段はそこを修正して使っている*3のでそこの修正が原因かもしれない)

コンパイラを差し替えるとかはよくないかもしれない。これらの問題は観察からメモリレイアウトに影響してそうなので、コンパイラを変えたから問題が無くなった→コンパイラが問題だったとはなかなか結論付けられない。
パストレースのような非常に長時間動作するプログラムでもまったく正常に動くのがさらに謎。

*1:DONT_GCしたからといって、通常のmallocが使われるわけではないので。。でも、skymoshで発生したオブジェクトすりかわり問題は発生しなくなるはずだから、少なくともそれではないことは判る

*2:Valgrind上ではBoehm GCが動作する前にGCの認識するスタック位置を修正する必要が有る。これは明示的なGC_INITが不要な状況でも必要。

*3:そうしないとWindowsで動かない