iOSアプリの開発をしていると、クラッシュしたときにを見かけます。これはどういう意味なのでしょうか?
SIGSEGVとは
SIGSEGV("Segmentation Violation"の略)は、アプリが不正なメモリアクセスを行ったときにオペレーティングシステムから送られるシグナルです。具体的には、アプリがアクセスしてはいけないメモリ領域にアクセスしようとした場合に発生します。例えば、NULLポインタの参照や、メモリが確保されていない領域に書き込みを行おうとしたときです。このようなエラーが発生したときにクラッシュさせないと、システム全体の安定性が脅かされ、さらに深刻な問題(例えばデータの破壊やセキュリティの脆弱性)が引き起こされる可能性があります。そこでシステムはアプリを即座に停止させて、システムの健全性を維持しようとします。
iOSアプリの開発中に見かける似たようなエラーのキーワードとして、EXE_BAD_ACCESSやKERN_INVALID_ADDRESS、SIGNAL 11やSegmentation Fault: 11があります。EXE_BAD_ACCESSは、メモリアクセスが許可されていない場所に行われたことを示します。KERN_INVALID_ADDRESSは、カーネル(オペレーティングシステムの核心部分)から発生するエラーで、無効なアドレスにアクセスしようとした際に返されます。SIGNAL 11は、Unix系システムにおけるシグナル番号11を示します。この番号は「Segmentation Fault」を意味し、プログラムが無効なメモリアクセスを行ったことを知らせます。たとえば、NULLポインタの参照、未初期化のポインタの使用、メモリの範囲外へのアクセスなどが原因となります。いずれもSIGSEGVと同様に、メモリ管理の問題に関連しています。
SIGSEGVが不正なメモリアクセスを示すのに対して、SIGABRT("Abort"の略)は、アプリが異常な状態に陥った場合に自身で停止を要求するシグナルです。通常、SIGABRTはアプリ内で意図的に呼び出されることはなく、標準ライブラリのアサート関数によってエラーが検出された場合などに発生します。SIGABRTが発生すると、通常はコアダンプ(メモリの内容をファイルに保存)が生成され、デバッグに役立ちます。
アプリがクラッシュした場合、エラーログ(クラッシュログ)は問題の原因を特定するための重要な手がかりを提供します。ログは通常、デバイスのシステムログに保存されます。iOSの場合、これらのログは「Console」アプリやXcodeを使用して確認することができます。ログには、クラッシュが発生したスレッド、クラッシュした関数やファイルの行番号、スタックトレースなどの情報が含まれています。これらの情報を解析することで、どのコードが問題を引き起こしたかを突き止めることができます。
シンボリケーション
iOSアプリをFlutterで開発している場合、クラッシュが起きたときにスタックトレースの一部が「???」となっていることがあります。これはシンボル情報が欠けているためです。
シンボリケーションとは、クラッシュログのメモリアドレスを人間が読める形式、つまりシンボル(関数名やファイル名、行番号)に変換するプロセスです。デバッグシンボルが含まれていないビルド(例えば、リリースビルド)ではこの情報が欠落しているため、シンボリケーションが不可能となり、アドレスが「???」として表示されることになります。シンボリケーションは、クラッシュの原因を特定するために不可欠です。
ちなみに、アドレスが0xで始まる理由は、16進数で表現されているからです。0xは16進数を示すプレフィックスで、メモリのアドレスを効率的に表現するために使用されて。