延々とGC調査

CFLAGSから、 -mthumb -mthumb-interwork を外し、 -fno-exceptions をつけてみた。
すると、swiSoftReset()後の最初のGC実行タイミングで固まるようになった(以前はこのタイミングで教祖エラーが出ていた)。
しかし、これが何を意味するのかまでは分からない。
普通に考えるなら、GC実行が何かをやらかしている、という風に思えるのだが、swiSoftReset()を行わない状態であれば、全く問題なく動作しているように見える。
swiSoftReset()の前と後で、何か違っているんだろうか。


GC調査も飽きてきたので、もう少し調べて駄目なら、GCを使うのはしばらく延期して本編進めよう。




状態の切り分け:

  • 全くGC_MALLOC()等を行っていない状態ではこの問題は発生しない(いくらでもソフトリセットok)。
  • ソフトリセットを行っていない状態ではこの問題は発生しない(いくらでもGC_MALLOC()、GC_gcollect()してもok)。
  • 基本的には、「GC_MALLOC()(おそらくGC初期化)」→「swiSoftReset()」→「GC_MALLOC()またはGC_gcollect()(状況により異なる?)」という手順を踏んだ時にエラーが発生する。
  • GC_MALLOC()で確保できる領域の末尾に予備領域が確保されない状態の時は、swiSoftReset()を呼んだ直後のGC_MALLOC()等でエラーになる。
    • 「予備領域が確保されない状態」は、具体的には以下の二パターン。
      1. コンパイルオプションに -DALL_INTERIOR_POINTERS -DDONT_ADD_BYTE_AT_END 両方付ける
      2. コンパイルオプションに -DALL_INTERIOR_POINTERS -DDONT_ADD_BYTE_AT_END 両方付けない
  • -DALL_INTERIOR_POINTERS を付け、 -DDONT_ADD_BYTE_AT_END を付けない状態でコンパイルする事で、swiSoftReset()を呼んだ直後のGC_MALLOC()ではエラーにはならなくなる。但し、ある程度動作した後(GC_gcollect()が動くと?)にエラーになってしまう。
  • コンパイルオプションから -mthumb -mthumb-interwork を外し、 -fno-exceptions をつけてみたところ、エラーになるタイミングで、エラーになる代わりにハングアップするようになる。
    • この事が何を意味するのかは不明。
  • -mthumb -mthumb-interwork のみ外した時は、エラーになるが、エラーの点滅(おそらく再帰的にエラーになっている)はしなくなる。但し、エラー画面に本来表示されると思われるレジスタ情報はやっぱり表示されず(おそらく、エラー表示とレジスタ情報表示の間で停止してしまっていると思われる)。


GC側は結構調べたので、swiSoftReset()を調べた方が良さそうだが……資料あるんだろうか。