ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - StackOverflowException が起こった場合の対処法 -

初めに

 StackOverflowException と呼ばれるエラーが起きる原因と対処法についてまとめます。また、StackOverflowException と同時に TLS Allocator ALLOC_TEMP_THREAD とコンソールにエラーが表示されることがあります。この解決方法についてもまとめます。

StackOverflowException とは

 StackOverflow による例外エラーのことです。StackOverflowとは、Stack(入れ物)がある条件によって溢れ出てしまうことです。

エラーメッセージ

 次のようなエラーメッセージがコンソールに表示されます。

StackOverflowException: The requested operation caused a stack overflow.

StackOverflow が起こる原因

 再帰処理によって、起こることが多いようです。再帰処理とは自らの処理を呼び出す処理が行われることです。

再帰処理の例)

void Start()
{
      Method();
}

private void Method()
{
      Method();
}

 上の例では、無限に Method という名前の関数が呼び出されます。このように、再帰処理で呼び出す関数が多すぎると、その結果、Stack が限界を超える、つまり Overflow します。

対処法

 無限に関数を呼び出すような設計をしないようにしましょう。
 
 下記スクリプトのような場合でも無限に関数を呼び出すため、StackOverflow が起きる場合があります。

void Start()
{
      Method1();
}

private void Method1()
{
      Method2();
}

private void Method2() 
{
      Method1();
}

TLS Allocator ALLOC_TEMP_THREAD とエラーの表示が出た場合

 StackOverflowException が起こると同時に次のようなエラーメッセージが表示されることがあります。

Assertion failed: TLS Allocator ALLOC_TEMP_THREAD, underlying allocator ALLOC_TEMP_THREAD has unfreed allocations

 次のようにすれば、解決します。

UnityメニューのAssets>Reimport ALL をクリック

※StackOverflowException を起こしていなくても次のような場面でこのエラーメッセージが表示されることがあるようです。

  • iOS向けに構築する
  • ビルド終了後コンソールを選択する

 Unity 自体のバグなようです。おとなしく Reimport しましょう。

最後に

 StackOverflowException は知らなければ、なぜエラーがでているのかわからないかもしれません。再帰処理を作る場合は、意識しておきましょう。