SIGSEGV

sigsegv.png

SIGはSignalの略
SEGVはSegmentation faultのこと。あれ、Vは??
簡単に言うとプログラムがメモリの変なところを操作しようとするとこのエラー(例外)が発行される。
これをやってしまったプログラムは、SIGSEGVというシグナルがOSカーネルから送信され、アプリは落ちる。
Android,iOSでも起こる。
これを連発するプログラムは品質が低いと言うことになる。[1]

SIGSEGVはonSrufaceCreatedが2回(or同時)に起こると起こることがあるらしい[2]
具体的には以下のような状況でSEGVが起こる:

  • 確保したメモリ領域を超えたところを操作してヒープやスタックを破壊する(配列オーバー)
  • メモリ領域を増やすためにメモリを確保し直したが、ポインタの更新を忘れてすでに無効となった所を操作する
  • エラーチェックを怠ってヌルポインタを参照する
  • リテラルなど、変更不能なものを書き換える
  • すでに解放した領域をまた解放する

Android のSIGSEGVの調査の仕方

SIGSEGVはネイティブ由来なので、

  • addr2lineを使う方法
  • ndk-stack..というNDK付属のツールを使う方法。これはNDKでビルドしたアプリじゃないと使えなさそうだ
Bibliography
1. セグメンテーション違反…ニコニコ大百科

ndk

サポートサイト Wikidot.com ndk