アプリで問題が起こったときの状況を把握する

Chapter 13 の「デバッグで実装上の不備を見つける」では、デバッグの開始方法や、ブレークポイントやステップ実行の詳しい使い方、実行状況の把握の仕方について説明しました。そこに掲載しきれなかった事柄をここで紹介します。

malloc_history コマンドで malloc スタックログを確認する

Run アクションの設定の中でMalloc Stackという状況ログを取得できることをXcode 5 徹底解説 for iOS/OS X10.4.2 Run アクションの中で軽く触れましたが、これを有効にして取得したmalloc スタックログの内容を確認する方法を紹介します。

malloc スタックログはデバッグ実行の間だけ保存されていて、Mac のターミナルを使って内容を確認できます。

malloc スタックログを表示する

アプリをデバッグ実行して、実行が一時停止の状態になったら、まずはデバッグコンソールから、実行中のアプリのプロセス番号を確認します。プロセス番号は、たとえば NSLog を実行したときに表示されます。

NSLog での出力ログがない場合には、上の例のようにpoコマンドを使って NSLog を実行します。次に紹介するように、malloc スタックログを確認するときには変数のアドレスも必要になるので、たとえば変数infoLogのスタックログを確認する予定なら、ついでに@"%p", infoLogのように NSLog に引数を渡して、アドレスも一緒に確認するのも良いでしょう。

malloc スタックログを確認するには、確認したい変数のアドレスも必要になります。変数のアドレスは、ソースコードエディター上の変数にマウスカーソルを置いて情報ボタンを押すと確認できます。

プロセス番号と変数のアドレスを確認したら、Mac からターミナルを起動してmalloc_historyコマンドにこれらの情報を添えて実行することで、この変数に関する malloc スタックログを確認できます。

特にこの画面では、基本情報の後に現れるALLOCで始まる行をたどってみると、その変数がどういう経緯で確保されるに至ったかが順番に記載されているので、これを手がかりにすることで、どこで確保されたメモリなのかを判断する材料にできます。