飛び立つLLDBプラグイン--Chisel

8088 ワード

LLDBはXCodeに内蔵された開発者向けのデバッグツールで、REPLの特性とC+、Pythonプラグインを備えたオープンソースデバッガです.LLVMコンパイラとともに、メインウィンドウの下部にあるコンソールに存在し、プロセス制御とデータ検出のデバッグ機能をより豊富に提供します.デバッガでは、プログラムが実行されている特定の時点で一時停止することができます.変数の値を表示し、カスタムコマンドを実行し、適切な手順に従ってプログラムの進行を操作することができます.デバッグ中にLLDBを使いこなすことで、デバッグを半分にすることができます.LLDBの詳細については、ここをクリックして、今日は主にフェイスブックのオープンソースのlldbプラグインChiselを紹介します.
1.chiselソースアドレスのインストール:Chisel Chiselはhomebrewを使用してインストールします.homebrewをインストールしていない場合は、homebrewを参照してください.homebrewインストール手順:端末入力コマンドruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"のインストールが完了したら、バージョンを表示し、コマンドbrew --versionを入力し、情報を印刷する:
Homebrew 1.3.7

他のコマンドはhelpを表示できます.
次にchiselをインストールします:コマンドを入力します:
brew install chisel

しかし、エラーメッセージの山を除いて発見されました.
xcrun: error: invalid active developer path (/Applications/Xcode.app/Contents/Developer), missing xcrun at: /Applications/Xcode.app/Contents/Developer/usr/bin/xcrun
Error: NaN

この場合、コマンドを実行できます
brew doctor

警告メッセージgitがインストールされていないので無視してコマンドを実行できます
brew install chisel

印刷情報:
==> Downloading https://github.com/facebook/chisel/archive/1.6.0.tar.gz
==> Downloading from https://codeload.github.com/facebook/chisel/tar.gz/1.6.0
######################################################################## 100.0%
==> Caveats
Add the following line to ~/.lldbinit to load chisel when Xcode launches:
  command script import /usr/local/opt/chisel/libexec/fblldb.py
==> Summary
  /usr/local/Cellar/chisel/1.6.0: 26 files, 163KB, built in 6 seconds

OK、これでchiselのインストールが完了し、離陸を開始できます.しかし離陸前に、もう一つのステップが完了する必要があり、インストールログのヒントに従って、~/.lldbinitファイルに行を追加し、なければ新規作成します.
touch .lldbinit
open .lldbinit

ヒントは次のようになります.
==> Caveats
Add the following line to ~/.lldbinit to load chisel when Xcode launches:
  command script import /usr/local/opt/chisel/libexec/fblldb.py

上記の手順に従って、Xcodeを再起動すれば試してみることができます.
2.内蔵コマンドChiselはlldbに新しい便利なコマンドを提供し、非常に実用的なコマンドです.2.1 pviewsこのコマンドは、すべてのviewを再帰的に印刷し、UIViewのプライベートアシストメソッド[view recursiveDescription]に相当する階層を表示することができる.この機能をうまく使用すると、位置決めの問題をデバッグする際に多くの面倒を省くことができます.使用例:
(lldb) pviews view
>
   | >
   | >
   | >
   |    | <_uilabelcontentlayer:> (layer)
   | >
   |    | <_uilabelcontentlayer:> (layer)
   | 

2.2 pvcこのコマンドも再帰印刷レベルですが、viewではなくviewControllerです.これを利用してviewControllerの構造を一目瞭然にすることができます.実はアップルもIOS 8で黙ってUIDIewControllerの1つの私有補助方法[UIViewController _printHierarchy]と同じ効果を追加しました.プレビュー効果:
(lldb) pvc
; frame = (0, 0; 414, 736)>
   | ; frame = (0, 0; 414, 736)>
   |   | ; frame = (0, 0; 414, 736)>
   | ; frame = (0, 0; 414, 736)>
   |   | ; frame = (0, 0; 414, 736)>
   |   |   | ; frame = (0, 64; 414, 628)>
   | ; frame = (0, 0; 414, 736)>
   |   | ; frame = (0, 0; 414, 736)>
   |   |   | ; frame = (0, 0; 414, 672)>
   |   |   | ; frame = (414, 0; 414, 672)>
   |   |   | ; frame = (828, 0; 414, 672)>
   | ; frame = (0, 0; 414, 736)>
   |   | 

便利なのか、viewControllerがviewDidLoadをすでに見ているかどうかも見えます.
これは興味深い機能で、Macのプレビューを使ってUIImage、CGImageRef、UIView、またはCALayerを開くことができます.この機能は、ビューの具体的な内容をキャプチャするために使用できるかもしれません.でも試してみると、しばらくはシミュレータでしか使えないので、本物はまだだめです.簡単な操作:
(lldb) visualize imageView

2.4 fv&fvc fvとfvcの2つのコマンドは、現在のメモリに存在するviewとviewControllerインスタンスをクラス名で検索するコマンドで、正規検索をサポートします.次のようになります.
(lldb) fv scrollView
0x18d3b8c0 UIScrollView
0x137d0c50 UIScrollView
0x131b1580 UIScrollView
0x131b2070 UIScrollView
(lldb) fvc Home
0x1393fe00 HomeFeedsViewController
0x138a8e00 HomeFeedsViewController
(lldb)

2.5 show&hideこの2つのコマンドは、指定されたUIViewを表示および非表示にするために使用されます.Continue Progressさえ必要ない効果が見えます.2.6 mask/umask border/unborderの2つのコマンドは、1つのviewまたはlayerの位置を識別するために使用され、maskはview上で半透明の矩形を上書きするために使用され、borderはviewに枠線を追加することができます.しかし、私が実際に使っている間にmaskはいつも間違っていて、バグがあると推定されています.mask/unmaskは一般的に使わないでください.borderコマンドを使うのは同じ効果です.どうせ両方の用途は対応するviewを見つけることです.2.7 caflushこのコマンドは再レンダリングされます.つまり、インタフェースを再描画することができます.これは[CATransaction flush]メソッドを実行することに相当します.アニメーション中にこのコマンドを実行すると、アニメーション終了の効果が直接レンダリングされることに注意してください.インタフェースの色や座標などをデバッグしたい場合は、コンソールで直接プロパティを変更し、caflushで効果を見ることができます.コードを変更してから、再buildするよりも手間が省けますか.例として、$122がターゲットUIViewである.
(lldb) p view
(long) $122 = 140718754142192
(lldb) e (void)[$122 setBackgroundColor:[UIColor greenColor]]
(lldb) caflush

2.8 bmessageこのコマンドは点を折るために使われています.皆さんは点を折るのが好きかもしれませんが、[MyViewController viewWillAppear:]の中で点を折るのが好きです.しかし、MyViewControllerはviewWillAppear:の方法を実現していません.従来のやり方はサブクラスでviewWillAppear:を実現し、点を断ち切ってからrebuildを実現する可能性があります.では、幸いbmessage命令がありました.この効果のブレークポイントを打つ必要はありません:(lldb) bmessage -[MyViewController viewWillAppear:]上のコマンドは、親のviewWillAppear:メソッドでブレークポイントを打つことができ、条件を追加しました:[self isKindOfClass:[MyViewController class]]
  • カスタムコマンドプラグインをカスタマイズすることもできますが、pythonを理解することが前提です.たとえばkeyWindowを印刷するwindowLevelを設計するコマンド:pythonスクリプトファイル/magical/commands/example.py:
  • を作成する
    #!/usr/bin/python
    # Example file with custom commands, located at /magical/commands/example.py
    
    import lldb
    import fblldbbase as fb
    
    def lldbcommands():
      return [ PrintKeyWindowLevel() ]
    
    class PrintKeyWindowLevel(fb.FBCommand):
      def name(self):
        return 'pkeywinlevel'
    
      def description(self):
        return 'An incredibly contrived command that prints the window level of the key window.'
    
      def run(self, arguments, options):
        # It's a good habit to explicitly cast the type of all return
        # values and arguments. LLDB can't always find them on its own.
        lldb.debugger.HandleCommand('p (CGFloat)[(id)[(id)[UIApplication sharedApplication] keyWindow] windowLevel]')
    

    ここで、PrintKeyWindowLevelのクラスが定義され、name description runメソッドを実装して、エンティティの名前、説明、および実行をそれぞれ示す必要がある.スクリプト作成後、前のインストール時に作成する~/.lldbinitファイルに行を追加します.
    script fblldb.loadCommandsInDirectory('/magical/commands/')
    

    それからXcodeを再起動してからカスタムコマンドを使うことができます.参考文献:Chisel-LDBコマンドプラグイン、デバッグをよりEasyとデバッガで踊らせる–LLDBのワルツ