iPhoneアプリ開発におけるデバッグのTIPS このエントリをはてなブックマークに登録

2010年11月11日

ダニーダニー / ,

2011-2-28 NSLogの出力を分りやすくするを修正しました。

新型MacBookAirをケーキ入刀用に買おうとしてるみなさんこんにちは。ダニーです。
iPhoneアプリ開発をしてるとメモリ周りで落ちることがあってデバッグするのが大変ですね,
今回はデバッグについて紹介したいと思います。

CGRectの中身を表示する

CGRect rect = CGRectMake(13, 30, 100, 200);
NSLog(@"%f %f %f %f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);

NSStringFromCGRectを使うと簡潔になります。

CGRect rect = CGRectMake(13, 30, 100, 200);
NSLog(@"%@", NSStringFromCGRect(rect));


ビューの背景色を変える

#define VIEW_RED(view) view.backgroundColor = [UIColor redColor]

複数の同じ色のビューが重なっている場合、位置調整したいビューの背景色を変えると
高さと幅と重なり具合が見やすくなります。

NSLogの出力を分りやすくする

NSLogでファイル名でファイル名と行数と関数名を付けてどこの場所で実行されてるかを分かりやすくします。

プロジェクト名_Prefix.pchに以下を追加します。

#ifdef DEBUG
#define PrintLog(format, ...) NSLog((@"%s: %d: %s: " format), __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
#else
#define PrintLog(format, ...)
#endif

プロジェクト->プロジェクト設定を編集->ビルドで
構成をDebugに設定した後、GCC_PREPROCESSOR_DEFINITIONSを検索して値にDEBUGと入れる。
これでDebugの構成時だけPrintLogの結果が出力されるようになります。

プロジェクト名_Prefix.pchに追加すると#importしなくてもどこからでも使えるようになります。

- (void)dealloc
{
     PrintLog();
     [super dealloc];
}

クラス内のdeallocにの中で呼ばれるようにしておくとXcodeのコンソールでdeallocが呼ばれてた場合NSLogで出力されるようになるので、開放されているのかが確認できて便利です。

例としてdeallocが呼ばれたときXcodeのコンソールで以下のような出力結果になります。

2010-11-10 01:41:40.282 test[22694:207] /Users/danny/Desktop/test/Classes/testAppDelegate.m: 29: -[Test dealloc]: 

メモリ関係のデバッグオプション

実行可能ファイルのファイル名を選択して情報を見るを押します。

そこで,環境に設定される変数という項目に+を押して名前をNSDebugEnabledとNSZombieEnabledとMallocStackLoggingをYESにしておきます。

ほかにも以下に環境に設定される変数について載っているので必要に応じて追加すればいいと思います。
Technical Note TN2124
Technical Note TN2124(日本語)
Enabling the Malloc Debugging Features

message sent to deallocated instance メモリアドレスで落ちる

message sent to deallocated instance メモリアドレスで落ちるのログを出力することで落ちる原因を特定しやすくする方法です。

さっきのデバッグオプションを設定してる状態で、(gdb)と表示されている所にinfo malloc-history メモリアドレスを入力します。 
上の画像の例だとメモリアドレスが0x12e4b0なので以下のようになります。

(gdb) info malloc-history 0x12e4b0

そのとき例として、Xcodeのコンソールにこのようなログが出力されます。


プログラム実行時に環境変数が有効になっているか調べる

NSLog(@"NSZombieEnabled: %s", getenv("NSZombieEnabled"));

getenvに環境変数名を指定して調べることが出来ます。

Core Foundationのソースコード

Foundationに相当するものをC言語で実装したCore Foundationのソースコードが公開されてます。
ソースコードを読んでみると参考になると思います。

Apple Open Source
2010年11月現在,Core Foundationの最新のソースコードはMac OS X 10.6.2より上はcoming soonになっているので
http://www.opensource.apple.com/release/mac-os-x-1062/
のCF-550.13です。

最後に

今回はiPhoneアプリ開発でよくやるデバッグ方法を紹介しました。なにかいい方法などありましたらコメントでお願いします。

  1. メモからはじめる情報共有 DocBase 無料トライアルを開始
  2. DocBase 資料をダウンロード

「いいね!」で応援よろしくお願いします!

このエントリーに対するコメント

  1. Technical Note TN2124
    Mac OS X Debugging Magic
    http://developer.apple.com/library/mac/#technotes/tn2004/tn2124.html

    K

    2010年11月11日, 4:19 PM

  2. ありがとうございます。大変参考になりました。
    今後もいろいろ参考にさせていただきます。

    「NSLogの出力を分りやすくする」をdebugのみでるように修正してみました。

    #ifdef DEBUG
    # define PrintLog(format, …) NSLog((@”%s: %d: %s: ” format), __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)

    #else
    # define PrintLog(…)
    #endif

    設定
    以下の画面遷移を行う。
    メニュー→プロジェクト→プロジェクト設定を編集→ビルドタブ

    「GCC_PREPROCESSOR_DEFINITIONS」を検索する。
    プリプロセッサマクロに値を「DEBUG」を追加
    これでデバッグ時のみログが出力されます。

    島村

    2011年02月17日, 11:05 PM

  3. コメントありがとうございます。
    NSLogの出力はdebugのときだけ出力するようにしたほうが
    いいですね。
    修正しておきました。

    ダニー

    2011年02月18日, 11:55 AM

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


トラックバック
  1. Ipadアプリ開発するぞ! » Blog Archive » Ipadアプリ開発するぞ!2011/02/17, 11:00 PM

    […] https://kray.jp/blog/iphone-debug/ […]

  2. 無料で学べる!iPhoneプログラム開発情報まとめ厳選38個! » SHINGOLOG2011/08/21, 4:42 PM

    […] iPhoneアプリ開発におけるデバッグのTIPS […]

  3. iOS開発備忘録 | source lab. note2011/12/11, 1:17 AM

    […] | アクトインディ技術部隊報告書 ・デバッグTips iPhoneアプリ開発におけるデバッグのTIPS | KRAY Inc ・CoreTextなUILabelのサンプル 属性付きラベルを作る その1 | HMDT Blog […]

  4. links | args2012/04/05, 8:59 PM

    […] デバッグに関するtips iPhoneアプリ開発におけるデバッグのTIPS | KRAY Inc This entry was posted in iOS and tagged iOS, links, memo by Hiroto. Bookmark the permalink. […]

  5. iOS開発ハマりどころメモ | blog.bouze.me2012/06/04, 12:13 AM

    […] ― デバッグTips iPhoneアプリ開発におけるデバッグのTIPS | KRAY Inc […]

  6. 無料で学べる!iPhoneアプリ開発情報まとめ厳選38個! | イリテク株式会社2014/08/26, 11:26 AM

    […] iPhoneアプリ開発におけるデバッグのTIPS […]

we use!!Ruby on RailsAmazon Web Services

このページの先頭へ