Upgrade to Pro — share decks privately, control downloads, hide ads and more …

バックトレースをアプリで取ってデバッグする

 バックトレースをアプリで取ってデバッグする

MOSA Tech Meeting (MTM) 2017 / 04 / 27 で発表したスライドです。バックトレースをアプリで取ってログに出力し、複雑なケースのデバッグにも対応できたことについての発表です。

Akira Hayashi

April 27, 2017
Tweet

More Decks by Akira Hayashi

Other Decks in Programming

Transcript

  1. バックトレースをアプリで取って
    デバッグする
    MOSA TECH MEETING 2017/04/27
    アールケー開発 林 晃

    View Slide

  2. 自己紹介
    • 林 晃
    • アールケー開発 代表
    • NPO法人MOSA 理事
    • Twitter : @studiork
    • Web : http://www.rk-k.com/
    • macOS, iOSアプリ開発、技術書執筆

    View Slide

  3. バックトレースって??
    • スタックトレースとも呼ばれる
    • あるメソッドが呼ばれるまでの呼び出し経路

    View Slide

  4. XCODEの場合
    • デバッグナビゲータに表示される

    View Slide

  5. アプリでバックトレースを取る
    // C
    #include
    int backtrace(void** array, int size);
    char** backtrace_symbols(void* const* array, int size);
    // Foundation (Swift and Objective-C)
    // NSThread class
    @property(class, readonly, copy) NSArray callStackSymbols

    View Slide

  6. どんなときに使う?
    • 複雑な呼び出し経路だったり
    • 色々な場所から呼ばれていたり
    • 複数の呼び出しの結果を組み合わせた複雑な条件のデバッグ

    View Slide

  7. ログの記録
    • 1イベント1行が扱いやすい
    • バックトレース部分は
    などで出力して1行にまとめる
    • オブジェクトの識別、ログの種類(解析するための情報)、バックトレースの順にすると解析しや
    すい

    View Slide

  8. ログの解析
    • 専用のコマンドラインツールを作る
    • 問題を検出した行を結果として出力
    • 出力された行のバックトレースの
    を改行に置き換える

    View Slide

  9. ケーススタディ DEMO
    • ARCを使っていない複雑なOBJECTIVE-Cのコード
    • 色々な場所から色々な経路で呼ばれるオブジェクトのメモリリーク検出

    View Slide

  10. ケーススタディ DEMOのまとめ
    • 次の情報を1イベント1行で出力
    • インスタンスのアドレス (0X1123BA460 など)
    • イベントの種類(A OR D, A: ALLOCATE, D: DEALLOCATE)
    • バックトレース (改行を
    )
    • 解析ツールでAとDのペアを処理をして、Aのみになっているものを抽出
    • →メモリリーク
    • 抽出されたもののバックトレースから問題箇所を特定

    View Slide

  11. INSTRUMENTS
    • リーク検出はINSTRUMENTSでもOKなはず
    • 理由は不明だが複雑なときに取りこぼしが起きた
    • 外部ライブラリをINSTALL_NAME_TOOLで書き換えていることが影響している可能性
    • 全てのライブラリが同じ開発環境ではないことも影響している可能性

    View Slide

  12. こんなときに特に有効
    • 数値変化で個々の数値は問題無くても、特定のパターンが現れたら検出したい
    • 特定の場所で確保したインスタンスが、特定の場所で処理したときに検出したい
    • 一定の数値以上なら検出したい
    • タイミングが重要でデバッガが使えない
    • 複数スレッド、複数プロセスにまたがるデバッグ
    • 開発環境を入れられない環境

    View Slide

  13. 専用解析ツール
    • SWIFTやPYTHONでなら、あまり手間無く作れる
    • 膨大なログの解析は手動では無理

    View Slide

  14. ご静聴ありがとうございました
    Copyright © 2017 Akira Hayashi

    View Slide