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

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

B6721fa2b0c10af071878ad23d190291?s=128

Victor Lee

May 14, 2019
Tweet

Transcript

  1. ライブラリーだって クラッシュレポートが⾒たい 2019/05/13

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

    Kotlin/Swift • Backend: Go/Rails • 最近はannotation processingに
 ハマってる 李 承益(りちぇんい) ࣗݾ঺հ
  3. ※2017年の情報

  4. • アプリだといろんなサービスが使える • Crashlytics • Firebase Crash • Developer Console

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

    未処理の例外を検知する • Java • Thread.setDefaultUncaughtExceptionHandler • Objective-C • NSSetUncaughtExceptionHandler ΫϥογϡϨϙʔτΛ࣮ݱ͢ΔͨΊͷखஈ 何かしらの⽅法でクラッシュを検知し、 クラッシュレポートを⽣成してアップロードする
  6. • アプリ本体のクラッシュと区別しないとまずい! • SDKはmain threadで動くことが少ないこともあるので、
 ⼀つの解決策としては、thread name/queue labelで区別すること • 他のクラッシュ検知SDKと共存できるようにしないとまずい!

    • Crashlytics • Firebase Crash Ϋϥογϡݕ஌ͷલఏ
  7. • SDKのthread nameに`io.repro.`のprefixを必ずつける • UncaughtExceptionHandlerを実装する • Thread nameを⾒て、処理するかどうかを判別 • 最後に本来のhandlerを呼び出すようにリレーする

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

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

    最後に本来のhandlerを呼び出すようにリレーする • これで問題なくCrashlytics/Firebase Crashと共存可能 • しかし、このhandlerに⼊ること⾃体は稀なので、
 ほとんどクラッシュレポートが⾶ばない… iOSͰͷ࣮૷ (2) iOS側も結局NSUncaughtExceptionHandlerで実装した
  10. • signal handlerでブレークポイントを貼っても⽌まってくれない • Simulatorだと、そもそもhandlerを置換できていないようにみえる • 勝⼿にアドレスが変わる… ͓·͚(1) Xcodeではsignalのデバッグができない

  11. • 実機でしか確認できない、デバッグモードで確認できない • => ログファイルに書き出し、実験後に回収して確認する • ios-deployを割と使えた • $ ios-deploy

    -W -Lrb xxx.app • $ ios-deploy -Ww -1 bundle.id -2 DIR • Crashlytics/Firebase Crashはすぐに反映してくれなかったりする • => 実験して、翌⽇まで反映待ち… ͓·͚(2) iOSでCrashlyticsとFirebase Crashと共存できているかの確認は⼤変だった
  12. • 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ばかりになる
  13. • 今まで気づいていないし、お客さんからも報告されていないバグを結 構修正できた! • でももう2度と触りたくない! ݁ہΫϥογϡϨϙʔτػೳΛ࡞ͬͯΑ͔͔ͬͨʁ