iPhone用の勝手アプリを開発していると、いつも困っちゃうのがデバック。そもそもドキュメントがなくって、ダンプされたヘッダを読み解く(想像する)しかないので、デバッグ機能がないに等しいのは大変なのです。だから来年2月の公式SDKには、マトモなデバッガが備わっていることを強く強く希望したいところ。
それで、現状ではどうするかと言うと、ソースコードにNSLog()を埋め込むか、weaselというシンプルなデバッガを利用するくらいしか方法がないようです。いずれの場合も、SSHを使ってMacからiPhoneに接続してデバッグします。
まず、今回取り上げるNSLog()は標準エラー出力で、printf()みたいなものです。詳しいフォーマットはココを見ていただくとして、よく使うのはこんな感じ。
NSLog(@”Hey!”);
NSLog(@”Superman runs for %d times.”, counter);
NSLog(@”ID=%d Rate=%f Name=%@”, intVar, floatVar, stringVar);
このようなNSLog()を適所に埋め込んだソースコードをコンパイルして、ビルドされたアプリケーションをiPhoneに転送しておきます。それから、Installer.appあるいはiNdependenceを使ってiPhoneにOpenSSHをインストールし、iPhoneのIPアドレスをメモしておきます。
次に、以下のような手順で、MacのターミナルからiPhoneのアプリケーションを起動します。
・Macでターミナルを起動し、以下のコマンドをタイプしてreturnキーを押す。255.255.255.255の部分は、実際にはiPhoneのIPアドレスに置き換える。
ssh -t root@255.255.255.255 “cd /; $SHELL”
・SSHで初めてiPhoneに接続する時は、本当に接続するか確認を求められるので、「yes」とタイプしてreturnキーを押す。
・パスワードを尋ねられるので、「alpine」(Firmware 1.1.Xの場合)または「dottie」(Firmware 1.0.Xの場合)とタイプしてreturnキーを押す。
プロンプトが「bash-3.2#」といった表示になれば、この後は(Macではなく)iPhoneを操作していることになります。この状態で、次のいずれかのコマンドでiPhoneのアプリケーションを起動します。ここではakaRemote.appを例としています。
・アプリケーションのディレクトリ内に移動して、実行ファイルを実行
cd /Applications/akaRemote.app/
./akaRemote
・ディレクトリを移動せずにアプリケーション(の実行ファイル)を実行
/Applications/akaRemote.app/akaRemote
以上で、アプリケーションが起動するので、NSLog()が実行されれば、その内容がターミナルに表示されるハズです。NSLog()の出力を見ることで、プログラムの動作や変数の内容を把握する訳です。もちろん、どこにどのようにNSLog()を埋め込むかが重要になりますね。

ちなみに、このようにして起動した場合、iPhoneのHomeボタンを押してもアプリケーションは終了しません。アプリケーションを終了するには、Macのターミナルでctrlキーを押しながらCキーを押します。
最後に老婆心ながら、超初級コマンドをいくつか書いておきます。
・ディレクトリ内を表示
ls
・ディレクトリ内をロング表示(パーミッションなどを確認)
ls -l
・パーミッションを変更
chmod 755 akaRemote
・ヘルプを表示
help
・SSH接続を終了
exit
ピンバック: iPhoneデバッグ〜weasel編 « akalogue