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

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

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

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

Avatar for Victor Lee

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ばかりになる