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

ライブラリーだってクラッシュレポートが見たい

 ライブラリーだってクラッシュレポートが見たい

Victor Lee

May 14, 2019
Tweet

More Decks by Victor Lee

Other Decks in Programming

Transcript

  1. • @konyavic • OS→Game→VC→Repro (2017/07~) • SDK: Java/Obj-C • Testing:

    Kotlin/Swift • Backend: Go/Rails • 最近はannotation processingに
 ハマってる 李 承益(りちぇんい) ࣗݾ঺հ
  2. • アプリだといろんなサービスが使える • Crashlytics • Firebase Crash • Developer Console

    • SmartBeat • ΫϥογϡϨϙʔτ͸඼࣭վળͷͨΊͷॏཁͳπʔϧ ライブラリーを作る側としても、
 ⾃分が出したライブラリーがどんなクラッシュを起こしているか把握したい!
  3. • SIGABRT, SIGSEGVを検知する • POSIX sigaction(2) • 4.0BSD signal(3) •

    未処理の例外を検知する • Java • Thread.setDefaultUncaughtExceptionHandler • Objective-C • NSSetUncaughtExceptionHandler ΫϥογϡϨϙʔτΛ࣮ݱ͢ΔͨΊͷखஈ 何かしらの⽅法でクラッシュを検知し、 クラッシュレポートを⽣成してアップロードする
  4. • SDKのthread nameに`io.repro.`のprefixを必ずつける • UncaughtExceptionHandlerを実装する • Thread nameを⾒て、処理するかどうかを判別 • 最後に本来のhandlerを呼び出すようにリレーする

    • これで問題なくCrashlytics/Firebase Crashと共存可能 AndroidͰͷ࣮૷ Android側はJavaの例外処理だけで⼗分なので、UncaughtExceptionHandlerで実装する
  5. • AndroidのUncaughtExceptionHandlerと同じようにsignal handlerを リレーする必要があるけど、 • Crashlytics/Firebase Crashは共にリレーしてくれない • 初期化するときは⾃前のsignal handlerが⼀番最後にインストー

    ルするようにしないといけない • Firebase Crashにリレーできても、なぜかSIGSEGVの場合だけ Firebase Crashのhandler内で更にクラッシュが発⽣する iOSͰͷ࣮૷ (1) iOS側はsigaction/signalの実装でうまくFirebase Crashと共存できなかった
  6. • SDKのdispatch queue labelに`io.repro.`のprefixを必ずつける • NSUncaughtExceptionHandlerを実装する • queue labelを⾒て、処理するかどうかを判別 •

    最後に本来のhandlerを呼び出すようにリレーする • これで問題なくCrashlytics/Firebase Crashと共存可能 • しかし、このhandlerに⼊ること⾃体は稀なので、
 ほとんどクラッシュレポートが⾶ばない… iOSͰͷ࣮૷ (2) iOS側も結局NSUncaughtExceptionHandlerで実装した
  7. • 実機でしか確認できない、デバッグモードで確認できない • => ログファイルに書き出し、実験後に回収して確認する • ios-deployを割と使えた • $ ios-deploy

    -W -Lrb xxx.app • $ ios-deploy -Ww -1 bundle.id -2 DIR • Crashlytics/Firebase Crashはすぐに反映してくれなかったりする • => 実験して、翌⽇まで反映待ち… ͓·͚(2) iOSでCrashlyticsとFirebase Crashと共存できているかの確認は⼤変だった
  8. • Android • java.lang.OutOfMemoryError • android.os.DeadSystemException • FATAL EXCEPTION in

    Unity App - no stack trace available • iOS • Failed to grow buffer • unrecognized selector sent to instance ͓·͚(3) 普通にクラッシュレポートを全部集計するとOOMばかりになる