2012年8月28日火曜日

XCode4で、メモリリークをデバッグ

検索してもなかなかゴールまでたどり着かなかったのでメモ。
なぜなかなか引っかからなかったかというと、XCodeのバージョン。
3はあるけど、4はない、みたいな。

取りあえず、以下の通り。

まず、「Manage Schemes...」を選択
開いているProjectを選択して、画面左下の「Edit」を押下。

画面の右ペインに「Environment Variables」という所があるので、
図のように3項目をvalue=YESで設定してあげる。
すると、DebugConsoleに誰がどこでalloc、freeしたががわかるようになる。
早速、EXC_BAD_ACCESSがでるコードをエミュレートしてみると、以下のようなログがでると思います。

2012-08-28 19:36:35.367 HelloWorld[38022:1be03] cocos2d: cocos2d v2.0.0
2012-08-28 19:36:35.368 HelloWorld[38022:1be03] cocos2d: Using Director Type:CCDirectorDisplayLink
2012-08-28 19:36:35.421 HelloWorld[38022:1be03] Retina Display Not supported
2012-08-28 19:36:35.428 HelloWorld[38022:1be03] cocos2d: animation started with frame interval: 60.00
2012-08-28 19:36:35.434 HelloWorld[38022:1be03] cocos2d: surface size: 480x320
2012-08-28 19:36:35.436 HelloWorld[38022:1be03] cocos2d: CCTexture2D: Using RGB565 texture since image has no alpha
[Switching to process 38022 thread 0x1f113]
[Switching to process 38022 thread 0x1be03]
2012-08-28 19:36:37.279 HelloWorld[38022:1be03] *** -[CCSprite zOrder]: message sent to deallocated instance 0xaa87e20
sharedlibrary apply-load-rules all
(gdb) shell malloc_history 38022 0xaa87e20

最後の行に「(gdb)」ってでると思うので、ここで「shell malloc_history {PID} {インスタンスアドレス}」というコマンドを打ってあげると、以下のようなログがでて、メモリの履歴を見れます。

ALLOC 0xaa87e10-0xaa87e4f [size=64]: thread_b024f000 |thread_start | _pthread_start | cvmDoWork | (省略) | malloc | malloc_zone_malloc 
FREE  0xaa87e10-0xaa87e4f [size=64]: thread_b024f000 |thread_start | _pthread_start | cvmDoWork | (省略) | free 
(省略)と書いた所に、自分が作成したクラス名とかメソッド名が記載されていたら、そこに問題アリって感じでデバッグできるよ。

0 件のコメント:

コメントを投稿