他所で落ちないのにウチでは落ちる
時間無いので簡潔に纏めると、
- デバッグオプションを設定しておくと、落ちるときは落ちる http://wiki.monaos.org/index.php?.mjt%2Fmosh%2FGC%20Assertion
- デバッグオプションが無いときはとにかくなにか間違った事が起こる
- オブジェクトがすりかわる(skymosh)
- シリアライズしたライブラリがおかしい - http://wiki.monaos.org/index.php?Mosh%2FBugs%2Fserialize-library
- psyntax.hをこっちの環境で作るとたまにコンパイルできないファイルになる(尻切れになる)
ただ、想定できる原因がめちゃくちゃ多い。そもそもこれらの不思議な現象がすべて同じ原因とも言い切れない。
- GC_INIT前にgc_*を呼んでいる(たぶん無罪)
- (そのほかGCの使い方)
- 何かコンパイル時あるいは実行時に間違ったことが起きている
- gccのバグ
- ライブラリのシリアライザのバグ(new!) - http://wiki.monaos.org/index.php?Mosh%2FBugs%2Fserialize-library
- GCのバグ(VERY unlikely)
- 実は本当のi386では死なないのかもしれない
- 実はテスト機のメモリがおかしい
しかもリビジョンによっては死なない。
マルチスレッドにしてVM間でオブジェクトを交換しまくるとよく落ちるが、これまた別の要因(そもそもVMクラスがスレッドセーフでない)という可能性も有るのでなんとも言えない。
こういう場合はどこから手をつけるのが正しいのだろうなぁ。。
まぁ大抵の場合は、起きてそうなことから手をつけるのが正しい。つまり、
- シリアライザ(やコンパイラ)を他のSchemeに移植して両方で結果を検証するようなのを作る
- (とにかく何か信頼できるポイントが必要。)
- シリアライザが生成したFASLバイナリが正しいかを検証する
- (どうするんだろう)
- シリアライズしたライブラリは一切使わないで問題が再現するかを試す
- (同上)
- GCを無効にしてValgrindしてメモリエラーを探す
コンパイラを差し替えるとかはよくないかもしれない。これらの問題は観察からメモリレイアウトに影響してそうなので、コンパイラを変えたから問題が無くなった→コンパイラが問題だったとはなかなか結論付けられない。
パストレースのような非常に長時間動作するプログラムでもまったく正常に動くのがさらに謎。