watermint.org

Takayuki Okazaki's blog

Share on Facebook
Share on GREE
このエントリーをはてなブックマークに追加
はてなブックマーク - お客様の中に名探偵はいらっしゃいませんか?

なんて思ってたら、


!!!
お客様の中に名探偵の方はいらっしゃいませんか?><

ということで、iOS Advent Calendarのネタです。今回は、iOSデバッグ界隈の中ではマイナーと言われるか、一部のファンに熱狂的な支持!といわれるか絶妙なバランスを保ったDTraceでのデバッグを取り上げます。

DTraceはもともと、Sun Microsystemsによって開発されSolaris 10に搭載されたデバッグフレームワークです。現在は、FreeBSDやMac OS Xなどでも利用することが出来ます。詳しい説明は今回は省きますがTraceと名前がついていることから想像できる通り、プログラムの実行をトレースしてどのコードが、どういう風に実行されたか。といったことを調べることが出来ます。

こんなことはありませんか?

  1. 初期化処理がどうやらうまくいっていないようだが、どこまで実行されたか知りたい。しかし、Xcodeのデバッガでステップ実行・ブレークポイント設定などしながら確認するにはプログラムが大きすぎる。
  2. NSLogを埋め込んでどこまで実行されたか確認したいが、そもそもログを埋め込むのが面倒くさい。または、ソースコードをNSLogだらけにして汚したくない。

個人的にはXcodeのブレークポイント設定はなかなかよく出来ていると思っていて、多くのケースではそれで足りると思っています。

Xcodeでブレークポイントを設定してActionにSoundを設定、ブレークポイントは自動的に続行するように設定しておけばその該当箇所が実行されたかどうか音で聞き分けて調べることが出来ます。初期化関連の問題を探すときなんかは個人的にはよく利用しています。

さて、これでも十分なんですが設定したいブレークポイントが増えてくると音の種類も限定されますしどの音がどのブレークポイントだったかよくわからなくなります。Log Messageなどのアクションを設定してログ出力するのもいいのですが、網羅的にブレークポイント設定は面倒くさすぎます。

こういうときに威力を発揮するのがDTraceです。まずは手っ取り早くつかってみましょう。XcodeについているiOSのサンプルプロジェクトLazyTableImagesを題材にしています。Xcodeであなたのデバッグしたいプロジェクトを開いて、シミュレーター上で実行してください。出ましたか?

次にターミナルから次のコマンドを実行します。

$ ps ax | grep Simulator | grep -v iPhoneSimulator

すると次のようにiOSシミュレーター上で実行されているアプリのプロセスIDが分かります。下の例だと85894ですね。

85894   ??  SX     0:00.33 /Users/watermint/Library/Application Support/iPhone Simulator/4.0.2/Applications/993BF578-B81F-4B4C-97FA-B6B6843DD47E/LazyTable.app/LazyTable
88978 s004  R+     0:00.00 grep Simulator

さてこれが分かったら続いてdtraceを実行します。dtraceは他の人の実行しているプロセスなども丸裸にしてしまうなどでき、セキュリティー上の課題があるため一般ユーザでは実行できません。sudoをつかって実行しましょう。下記の85894の部分は調べたプロセスIDに読み替えてください。

$ sudo dtrace -p 85894 -n ‘objc$target:::entry { printf(“[%s %s]\n”, probemod, probefunc); }’

できましたか?できたらアプリを適当にタップするなど動かしてみてください。

このようにObjective Cで実行された関数がリアルタイムに出力されます。どうでしょうか?これでNSLogを仕込まなくてもトレースがとれるようになりましたね。でもちょっと出力が多すぎるようです。これではデバッグの役に立てるにはややしんどいです。出力を抑制してみましょう。

objc$target:::entryのところを、objc$target:クラス名::entryと書き換えてみましょう。ここではLazyTableImageにあるクラスのIconDownloaderとしましょうか。実際に実行するときにはあなたのプロジェクトにあるクラスをつかってください。

$ sudo dtrace -p 85894 -n ‘objc$IconDownloader::entry { printf(“[%s %s]\n”, probemod, probefunc); }’


出力が一気に減って、IconDownloaderだけになりましたね。ご想像の通り、関数名でもフィルタできます。

$ sudo dtrace -p 85894 -n ‘objc$target:IconDownloader:-indexPathInTableView:entry { printf(“[%s %s]\n”, probemod, probefunc); }’

便利ですね。これでたとえば、初期化処理のときに通らなければならない関数がちゃんと実行されているかどうか分かるようになりました。クラス名や関数名にはワイルドカードが使えます。たとえば、IconDownloader以外にIconButton、IconButtonLabelなどのクラスがあった場合にはIcon*というようにアスタリスクを指定するとIconで始まるクラス名にマッチします。

さて、デバッグしていて原因箇所がなんとなくわかってきたときに知りたいのはその関数がいつ、どこから呼ばれたか?です。呼び出し元を知りたいですよね。そういうときは、もうちょっと凝ったdtraceの使い方をしてみましょう。

次のようなファイルを用意して、trace.d というファイル名で保存しておきます

#pragma D option quiet

self int level;

objc$target:::entry
{
  printf("%*s[tid=%lld][%s %s]\n",
    self->level * 2, " ->",
    (long long)tid, probemod, probefunc);
  self->ts[probefunc] = timestamp;
  self->level++;
}

objc$target:::return
{
  time = timestamp - self->ts[probefunc];
  self->level--;
  printf("%*s[tid=%lld][%s %s] [%dms]\n",
    self->level * 2, " <-", (long long)tid,
    probemod, probefunc, time / 1000);
}

ではこれを実行してみましょう。

$ sudo dtrace -p 85894 -s trace.d

このように関数呼び出しをツリー状にしてダンプできます。後は必要に応じてクラス名や関数をフィルタしていけば良いでしょう。

さて、すこし駆け足になりましたがXcodeのデバッガをつかう場合と比べてだいぶ便利な機能があることがお分かりいただけたでしょうか?

コマンドラインからの実行に抵抗があるというかたはInstrumentsからもDtraceは実行できます。

さて、すこし駆け足になりましたが最後に制約事項を説明しておきます。dtraceはOS側に仕込まれたプローブという検出ポイントに対して働きます。このため、トレースしたい内容のプローブがOS側で実装されていることが必須です。このため、dtraceのプローブを持たないiOSにはdtraceを接続できません。必ずiOSシミュレータ上で実行しているアプリに対してdtraceを実行してください。

iPhoneやiPadなどのiOSが動作している実機に対しては別途従来通りのXcodeやgdbを用いたデバッグが必要です。

Mac OS XのdtraceにはObjective Cのためのプローブがいくつか用意されています。詳しくはman dtraceを参照してください。

Share on Facebook
Share on GREE
このエントリーをはてなブックマークに追加
はてなブックマーク - Mac OS X Snow Leopardを英語環境で使う

OSは普段使う分には日本語環境で十分なのだけれど、ときどき英語環境でないと困ることがある。そのなかで顕著なケースが、新しい開発用ソフトを使う場合。ここ半年ほど使っているiPhone/iPad向けアプリを開発するために使っているXcodeもその一つ。普通に開発している分には何ら問題がないのだけれど、初めて使うフレームワークや、次々と追加される新しい機能を使う上では英語環境にした方が都合がいい。新しい開発環境に関する情報は英語しかないし、メニューの名前も英語だから。下手に日本語化されているとどれかわからなくて困ることも。

Language settings

言語環境を変更するにはシステム環境設定から、言語とテキストで順番を入れ替えるだけ。?さて、英語環境にしたときに困るのが、いくつかのアプリケーションは日本語環境でなければ正常に動作しないこと。Illustrator、Photoshop、Safariあたりがそう。Illustratorはプラグインの読み込みにいくつか失敗し、Photoshopは実用上困ったことはないけれど一部メニューが文字化け、SafariはAccept-Languageがenになって一部Webが文字化け。そういうときには、個別にアプリケーションに対して言語設定を実施。Mac OS X 10.5 LeopardまではFinder.appから設定できたけど、Snow Leopardではできない模様。

Language settings for some applications

コマンドラインで次のように入力。

defaults write $(mdls -name kMDItemCFBundleIdentifier -raw /Applications/Adobe\ Illustrator\ CS4/Adobe\ Illustrator.app) AppleLanguage “(ja)”

のように入力してアプリケーションを再起動すれば完了。

Share on Facebook
Share on GREE
このエントリーをはてなブックマークに追加
はてなブックマーク - iPhone 4、故障と交換

iPhone 4 restore failed with iTunes

少し前の話ですが、7月末頃、iOS 4.0からiOS 4.0.1にアップデートしようとしたところ、「iPhone”iPhone”を復元できませんでした。不明なエラーが発生しました(9)」というエラーがでてアップデートが完了しません。iMacを再起動してみたり、MacBook Pro側で試してみたり、違うUSBポートから実行してみたりなどかなり多くのパターンを試してみましたがどのパターンもだめ。

_DSC1625.jpg

何度試してもiPhone 4側にiTunesにつないで復旧せよ、という表示のまま。仕方なく、渋谷のApple Storeへ持ち込み。Apple Storeでも現象が再現し、iPhone 4本体は交換となり無事復旧しました。

_DSC2483.jpg

ちなみに交換してもらったため、本体への技適マーク表記がなくなっています。iOS 4は技適マーク表記があるので電波法上問題はありませんが、本体に印字されているという希少価値がなくなったのはちょっと残念。まあ、新しくなったのでよしとしましょう。

Share on Facebook
Share on GREE
このエントリーをはてなブックマークに追加
はてなブックマーク - iPhone 4

_DSC0683.jpg

ブログに書くのが遅くなりましたが、iPhone 4が届きました(6月29日)。2年間つかったインターネットマシンことSoftBank 922SHからの機種変。なんだかんだ、届いてから1ヶ月ぐらいですね。

_DSC0687.jpg

Retina Displayは確かにおそろしくきれい。デバイスの持つ表現力もさることながら、iOS自体もこれに向けて周到に準備が整えられていたのが大きいと思います。高ppi対応は記憶が正しければ、Mac OS X Leopardあたりから本格的に入り始めたので3年の月日をかけて熟成させ、MacではなくiPhoneに最初に導入された訳です。WindowsもVistaからは高ppi対応が入っていて、2007年当時、これからはディスプレイが「○?○万画素!」と謳われて電気屋で売られる想像を当時していましたが予想は外れて、2010年ようやくスマートフォンがその戦いを始めようとしているようです。

_DSC0731.jpg

iPhone 4を約1ヶ月使っての感想です。iPhone 3GSも平行して使っていますが、使ってみるとiPhone 4は確かに優れていますがiPhone 3GSを置き換えるほどではないことに気づきました。なぜなら同じアプリがiTunesによって同期され、Mobile Meによってメールや連絡先などの情報は同期されているので使い勝手は何ら変わらないからです。言い換えれば、iPhoneの魅力はやはりアプリであって、iPhoneというデバイス自体の機能や性能差というのは微々たるものだと感じるようになりました。

Share on Facebook
Share on GREE
このエントリーをはてなブックマークに追加
はてなブックマーク - 今日のTimeMachineバックアップ, 急展開!

timemachine 2010.06.09

日曜日から実行しているTimeMachineによるバックアップがそろそろ終わりそうです。バックアップが10%ぐらい終了したあたりから、急に7MBytes/秒程度のスループットが出るようになりました。

timemachine 2010.06.10

何かのタイミングで、プログレスのダイアログが出なくなってメニューバー上にしか出なくなりました。あと残り約40GB。この分だと明日の朝には終わってそうです。

Share on Facebook
Share on GREE
このエントリーをはてなブックマークに追加
はてなブックマーク - 今日のTimeMachineバックアップ

timemachine

まだ実行中です。うちのTimeMachineバックアップがおわるのがはやいか、iPhone 4が出るのが早いか。まだまだかかりそうです。いったいいつ終わるんだろう。

Share on Facebook
Share on GREE
このエントリーをはてなブックマークに追加
はてなブックマーク - TimeMachineの初期バックアップはいつ終わるだろうか

CenturyのRAIDを設置してからようやく丸1日。いまSnow Leopardのバックアップ機能Time Machineを有効にして、バックアップを取っているところですが、さて・・いつ終わるでしょうか。

スクリーンショット(2010-06-06 21.15.32).png

上図はほぼ同時刻に開始したコピー処理ですが、Time Machineのトランザクションはおおよそ1/15の速度です。もし処理時間が単純コピーの処理に比例するなら、あと25〜30日といったところでしょうか。こんな悠長なバックアップで間に合うのか・・・・。

Share on Facebook
Share on GREE
このエントリーをはてなブックマークに追加
はてなブックマーク - iMac 27″ (Core i7), メモリ使用状況その2

Ubuntu, Solaris, and Windows on Parallels 5 on iMac 27
ParallelsでたくさんVMを立ち上げてみました。Windows XP, Ubuntu 9.10, Solaris 10 Update 8, OpenSolarisです。それぞれのVMに1GBずつRAMを割り当て、Solarisには2CPU (Hyper ThreadingのHardware Thread 2つ、つまりCore i7の場合1コア)を割り当てて起動してみました。
Activity Monitor, iMac 27
さすがにこれだけ立ち上げると16GBでも心細くなってきますね。ま、これ以上やるならAmazon EC2でも借りることになるでしょう。手元に置いておくという意味ではやっぱり今のスペックで十分すぎます。あえて欲を言うなら、H.264エンコードのアクセラレータが欲しいぐらいでしょうか。

Share on Facebook
Share on GREE
このエントリーをはてなブックマークに追加
はてなブックマーク - iMac 27″(Core i7), メモリ使用状況

Activity Monitor on iMac 27
メモリを16GBにしてからというもの、メモリ不足なんてみじんも感じなくなりました。Apertureが64bitモードで動作するため多めに使うようですが、Parallelsで複数のVMを立ち上げたり、Photoshop、Illustrator、InDesignなどの重量級アプリを複数立ち上げてもまだまだ余裕が感じられます。いままでは、新しいパソコンを買ってしばらくすると、これ以上やるとダメだなと思える処理が何かしらありましたが、今の環境にはそれがありません。デジカメが1,000万画素を超え、SDカードが8GBを超えたあたりでこれ以上望むべく所がなくなったのと同様、そろそろパソコンの性能も個人レベルで使うには限界に達してきたということでしょうか。

Share on Facebook
Share on GREE
このエントリーをはてなブックマークに追加
はてなブックマーク - Aperture 3とスライドショー書き出し

先週AppleからAperture 3がリリースされました。Apertureはたぶん、うちで一番良く使うソフト。迷わずアップグレード版を購入しました。1週間弱使ってみましたが、Aperture 2と比べても圧倒的に安定している上、動作も速くなっています。顔認識やスライドショーの追加、動画管理のサポートなどiPhoto ’09からも数多くの機能が移植されています。スライドショーはH.264/MPEG4への書き出しも可能です。昨年の旅行をスライドショーにして書き出してDVDにすることに。ところが、写真+動画で42分ほどの動画を書き出そうとしたところ、どうも失敗する。
スクリーンショット(2010-02-13 20.58.31).png
OSStatus error -9459。これが出てどうしようもなくなります。すこし調べてみたところ、同じ症状で困っている人がいるようです。

試行錯誤の結果、42分のスライドショーを20分程度ずつに分けて、エクスポートの形式をH.264ではなく、MPEG4、720×405@30fpsで出力ができました。DVD出力用に854×480@30fpsも試しましたが同じエラーで失敗。どうやら、何らかのサイズに影響されてエラーが出ているようです。
Aperture Software Update
Software Updateが出ていたので、なおるか期待しましたが、やはり同じエラーで失敗。仕方なく、720×405@30fpsのムービーでDVDを作ることにしました。
DVD Studio Pro
あとはDVD Studio Proで仕上げ。