無理な更新はお止めください。

ひたすらマイペースな人のブログ

Cocos2d-xでゲームを作るときのタチの悪いメモリバグを追跡する

個人開発者の方はこれで結構救われるんじゃないかな?
Cocos2d-xを使うゲームはC++で記述するので、メモリ関連のバグに悩まされるケースが多いと思います。Xcodeデバッグしてその場所を突き止められるのならいいのですが、メモリのオーバーランなんかだとしばらく問題なく動いた後に突然訳のわからないところでエラーが出てアプリが落ちるということになってしまいます。こうなると原因を特定することは非常に困難です。コンソールゲームの開発であればグローバルなnewを拡張するなど独自のメモリ管理の仕組みを使ってこれを検出するのが通常のようですが、少々難易度が高いです。自分もどうするか悩んでいたところ、stackoverflowにこんな記事を見つけました。

stackoverflow.com
注目は二つ目の回答。なんとXcodeでそれを検出することができるのだそうです。Edit SchemeのDiagnostics内のEnable Guard Mallocにチェックを入れます。そしてデバッグするのですが注意点があって、実機はダメでシミュレーターのみでこの機能が使えるそうです。Appleの公式もこちらにあります。developer.apple.com

で早速使ってみたんですが、いや〜もう出るわ出るわ(笑)。えっ、マジかよってな間違いがでてきて凹みます。

iOSAndroid仮想メモリシステムが入ってる分、ヒープの断片化はあんまり問題にならないのですが、こういうちょっとして死ぬ系のバグは起こります。それを見つけるためにこのXcodeの機能は非常に有効ですね。

お悩みの方はぜひ一度お試しあれ。


(追記 4/23)
これはメモリのバグを解決するものではなくてあくまで検出するためのものです。また、すべてのケースで検出できるかどうかは不明です。メモリリークやそもそものメモリ不足(特にiOS)などその他メモリ周りに起因するバグも存在します。メモリ管理には引き続き慎重な姿勢が求められることに変わりはありません。


新作アプリ作りました↓↓kondroid.hatenablog.com