MOSA Tech Meeting (MTM) 2017 / 04 / 27 で発表したスライドです。バックトレースをアプリで取ってログに出力し、複雑なケースのデバッグにも対応できたことについての発表です。
バックトレースをアプリで取ってデバッグするMOSA TECH MEETING 2017/04/27アールケー開発 林 晃
View Slide
自己紹介• 林 晃• アールケー開発 代表• NPO法人MOSA 理事• Twitter : @studiork• Web : http://www.rk-k.com/• macOS, iOSアプリ開発、技術書執筆
バックトレースって??• スタックトレースとも呼ばれる• あるメソッドが呼ばれるまでの呼び出し経路
XCODEの場合• デバッグナビゲータに表示される
アプリでバックトレースを取る// 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
どんなときに使う?• 複雑な呼び出し経路だったり• 色々な場所から呼ばれていたり• 複数の呼び出しの結果を組み合わせた複雑な条件のデバッグ
ログの記録• 1イベント1行が扱いやすい• バックトレース部分はなどで出力して1行にまとめる• オブジェクトの識別、ログの種類(解析するための情報)、バックトレースの順にすると解析しやすい
ログの解析• 専用のコマンドラインツールを作る• 問題を検出した行を結果として出力• 出力された行のバックトレースのを改行に置き換える
ケーススタディ DEMO• ARCを使っていない複雑なOBJECTIVE-Cのコード• 色々な場所から色々な経路で呼ばれるオブジェクトのメモリリーク検出
ケーススタディ DEMOのまとめ• 次の情報を1イベント1行で出力• インスタンスのアドレス (0X1123BA460 など)• イベントの種類(A OR D, A: ALLOCATE, D: DEALLOCATE)• バックトレース (改行を)• 解析ツールでAとDのペアを処理をして、Aのみになっているものを抽出• →メモリリーク• 抽出されたもののバックトレースから問題箇所を特定
INSTRUMENTS• リーク検出はINSTRUMENTSでもOKなはず• 理由は不明だが複雑なときに取りこぼしが起きた• 外部ライブラリをINSTALL_NAME_TOOLで書き換えていることが影響している可能性• 全てのライブラリが同じ開発環境ではないことも影響している可能性
こんなときに特に有効• 数値変化で個々の数値は問題無くても、特定のパターンが現れたら検出したい• 特定の場所で確保したインスタンスが、特定の場所で処理したときに検出したい• 一定の数値以上なら検出したい• タイミングが重要でデバッガが使えない• 複数スレッド、複数プロセスにまたがるデバッグ• 開発環境を入れられない環境
専用解析ツール• SWIFTやPYTHONでなら、あまり手間無く作れる• 膨大なログの解析は手動では無理
ご静聴ありがとうございましたCopyright © 2017 Akira Hayashi