- iOSアプリケーションのサポートを簡単にします。 パート1-Xcodeについていく
- iOSアプリケーションのサポートを簡単にします。 パート2-ロケーションとネットワーク
- iOSアプリケーションのサポートを簡単にします。 パート3-落下とログ
iOSアプリケーションを作成し、ベータテストを開始するようになった人は誰でも、「アプリケーションをいじってみて、それが何が起こったのか」というフレーズを知っているでしょう。 そして、このフレーズの後、「それ」がどうなっているかを理解しようとして数時間費やすことができました。
この状況に精通している場合、または将来これから自分を救う方法を知りたい場合は、カットをお願いします。
そして、私たち自身または顧客向けのアプリケーションを作成し、テストプロセスが進行中です。 顧客と同じように、テスターはあなたから1000km離れたところにいることができます。 それでは、奇妙なバグについて知らされているいくつかの状況を見てみましょう。それはあなたにとって難しいか、まったく再現できないかのどちらかです。
パレードのヒットは再現するのが難しいか、ディベースするのが難しいです。
つまり、問題に到達するのが難しい(窓の外の天気が正確に-40である必要があり、あなたの場所が赤道にある場合でも、非常に特殊な条件でアプリケーションに深く入り込む必要がある)か、同じアクションを何度も繰り返す必要があります。 後者の場合、各反復でブレークポイントに到達するという事実はなんとなく面倒ですが、このコード行で何かが起こるはずです。バグを再現することができた場合は、それについて詳しく調べる必要があります。
iOS / MAC用のアプリケーションを開発するすべての人は、ブレークポイントを設定し、アプリケーションがクラッシュ/不正に動作する前に何が起こるかを理解しようとしなければなりません。 残念ながら、多くの場合、開発者は利用可能な機能のごく一部を使用します。 Habrumは、ブレークポイントの全機能使用に関する記事を1つだけ見つけました。 lldbを使用したアプリケーションのデバッグについては、一般的に耳が聞こえません(まあ、または私の検索能力では必要な記事を見つけることができませんでした)。
ブレークポイント
すばらしい記事ですが、 シンボリックブレークポイントの説明はそこにありませんでした。 したがって、この記事を読むことをお勧めします。 シンボリックブレークポイントについて説明します 。そのため、不正な動作を再現する起動を実現できました。 そして、 UIViewControllerが表示されたときにそれが起こったとしましょう。しかし、それは悪いです、あなたは実装されたメソッドを持っていません-[MyViewController viewDidAppear:]瞬間。 この状況では、 シンボリックブレークポイントが便利になります。
キャラクターを運転するだけです-[UIViewController viewDidAppear:]
適切なタイミングで停止します。
Symbolicブレークポイントのもう1つの非常に便利なアプリケーションは、別の開発者からプロジェクトを取得し、テスターから問題の説明があることです。 そして、あなたはアプリケーションでそこに到達する方法を理解していますが、これをコードと相関させる方法は? コードベースは膨大なものになる可能性があり、アニメーションは何が起こっているのかを示唆します-[UINavigationController pushViewController:animated:] 、これがどこで起こるのかは明確ではありません。 Symbolicブレークポイントを追加します : -[UINavigationController pushViewController:animated:]このメソッドのすべての呼び出しで停止します。
ただし、システム関数にシンボリックブレークポイントを使用する場合、 selfも_cmdもありません。通常利用できるものはありません。 したがって、外部からコントローラーにアクセスする必要があり、 lldbが役立ちます。
LLDB
アプリケーションが起動したら、一時停止をクリックします- (lldb)を参照してください? これはデバッガコンソールです。 彼が実行できる便利なコマンドはたくさんありますが、一番最初はhelpです。 これで、残りの便利なコマンドを見ることができます。最も人気のあるものはpo (印刷オブジェクト)です。 -[NSObject debugDescription]を出力します。NSLogは[NSObject description]を出力します。 アプリケーションでのロギングをより便利にするために説明を再定義するときは、 debugDescriptionも忘れないでください 。
中断したところから続行します。コンソールがあり、アプリケーションの適切な場所にいます。 しかし、少なくとも、完全なUIView階層を取得する必要があり、 MyViewControllerのすべてのivarがあると便利でしょうか?
アプリケーションのUIWindowへのポインターを見つけるには、次のように入力する必要があります
po [[[UIApplication sharedApplication] delegate] window]
UIWindowへのポインターを取得しました。rootViewControllerへのポインターを取得しましょう
po [(UIWindow *)<pointer> rootViewController]
これで、メインコントローラーへのポインターができました。 同様の操作により、子またはプロパティを介して必要なコントローラーに到達できます。
そして、 MyViewControllerへのポインターがあります。 整数_ivarが必要で、誰もそのプロパティを作成していないと仮定します(追加のゲッターとセッターは不要です)。
募集します
po ((MyViewController *)<pointer>)->_ivar
これで必要なものはすべて揃いました。
オブジェクトに関する情報の表示は、機能の一部にすぎません。 Toggle Slow Animationsをクリックしてシミュレーターのように、デバイス上でアニメーションを遅くしますか? これは、アプリケーションを再起動せずにこれを行う方法のオプションです
expr -- ((CALayer *)[[[[UIApplication sharedApplication] delegate] window] layer]).speed = 0.2
完了-この起動時にはアニメーションが遅くなり、適切なタイミングでこの起動を行うことができます。 疲れたら、値1を返します。
これらの例は単純なものかもしれませんが、基本的な機能を明確にします。 そして、はい、忘れないでください、私は信じられないほどの整列
のみ
前の説明には大きなマイナス点が1つあります。適切なコントローラーを使用するには非常に長く高価な時間がかかります。 しかし、あなたを助けるプロジェクトがあります- ノミ 。 この同志は多くのことを行うことができます 。チームのリストはここにあります 。 ビューが透明であるためにビューの位置がわからない場合は、境界線を強調表示できます(たとえば、maskコマンドを使用して)。 ボタン上のテキストを知っていれば、それを見つけることができます(pa11yコマンド)。 また、事前に準備して、accessibilityLabelテキストを要素テキストと一致させると、何でも検索できます。 chiselをインストールすると、そのコマンドのリストがlldbでできることの完全なリストに追加されます 。私にとって、ヒットパレードはpviewsとpvcです。 これらのコマンドは、UIViewとUIViewControllerの階層を表示します。 チームの種類と仕組みを突然理解する必要がある場合は、 help <team name>と入力します。
一般に、このツールに慣れるか、少なくともそれを置くことをお勧めします。それを押しても問題が再現する場合、そのようなアシスタントがいない場合にのみ頭の髪を引き裂くだけです。
lldbとchiselの魅力的な機能は、上記で終わっていません。 彼らは終わりなく深く行くことができます。 しかし、ほとんどの中規模のプロジェクトでは、これで十分です。