配信アプリで使用している Broadcast Extension 上で発生したクラッシュの詳細について、クラッシュ発生時のスタックトレースを取得して解析し、複数のクラッシュの修正に繋げた話。
"QQ&YUFOTJPOͷελοΫτϨʔεใ͔ΒΫϥογϡΛղੳूܭ͢Δ/BSVLJ$IJHJSB!@OBSV@KQOJ04%$
View Slide
ϛϥςΟϒΞϓϦͷ͝հ
ࠓճͷͷഎܠ
&ΞϓϦຊମ #SPBEDBTU&YUFOTJPOϛϥςΟϒͷJ04ΞϓϦ#SPBEDBTU&YUFOTJPOΛར༻ͯ͠৴ॲཧΛ͍ͯ͠Δ
&ΞϓϦຊମ #SPBEDBTU&YUFOTJPOΞϓϦຊମͱ#SPBEDBTU&YUFOTJPOผͷϓϩηεͱͯ͠ಈ࡞͍ͯͯ͠ɺྫ͑ͲͪΒ͔͕Ϋϥογϡͯ͠ɺ͏Ұํಈ͖ଓ͚͍ͯͨΓ͢Δ💥৴ͯ͠ΔΑΫϥογϡͨ͠
&ΞϓϦຊମ #SPBEDBTU&YUFOTJPOΫϥογϡ͕ൃੜͨ࣌͠ɺͦΕͧΕͰߦ͍ͬͯΔॲཧҟͳ͍ͬͯΔ💥 💥
ΞϓϦຊମΞϓϦຊମΫϥογϡใΛ'JSFCBTF$SBTIMZUJDTʹૹ৴͍ͯͯ͠ɺ'JSFCBTFͷίϯιʔϧ্ͰΫϥογϡΛ֬ೝͯ͠ରԠ͍ͯ͠Δ💥📝
ϩά༻αʔόʔ&#SPBEDBTU&YUFOTJPO#SPBEDBTU&YUFOTJPOʹ'JSFCBTF$SBTIMZUJDTΈࠐ·Ε͓ͯΒͣɺಠࣗʹΫϥογϡ࣌ͷใΛऔಘ͍ͯ͠Δ💥📝5ISFBEDBMM4UBDL4ZNCPMT
ϩά༻αʔόʔ&#SPBEDBTU&YUFOTJPOݩʑɺϩάΫϥογϡͷൃੜසΛѲ͢ΔͨΊʹ༻͞Ε͍ͯͯɺऔಘ͞Ε͍ͯΔใΛݟ͚ͨͩͰΫϥογϡͷৄࡉ͔Βͳ͍💥📝5ISFBEDBMM4UBDL4ZNCPMT
ˠ#SPBEDBTU&YUFOTJPOͷΫϥογϡͷमਖ਼ΞϓϦຊମͱൺֱͯ͠ɺܦݧʹґΔͱ͜Ζ͕େ͖͔ͬͨݩʑɺϩάΫϥογϡͷൃੜසΛѲ͢ΔͨΊʹ༻͞Ε͍ͯͯɺऔಘ͞Ε͍ͯΔใΛݟ͚ͨͩͰΫϥογϡͷৄࡉ͔Βͳ͍
&ΞϓϦຊମ #SPBEDBTU&YUFOTJPOͷ͡ΊɺʮΠϠϗϯ৴ʯͱݺΕ͍ͯΔػೳͷվमʹͬͯ#SPBEDBTU&YUFOTJPOͰ৽ͨͳΫϥογϡ͕ൃੜ͢Δ͜ͱ͕ͳΜͱͳ͔͍ͬͯͨ͘💥
ˠͲ͏͍͏༰ͷΫϥογϡ͕ɺͲͷ͘Β͍ͷׂ߹Ͱൃੜ͍ͯ͠Δ͔ௐΔखஈ͕ཉ͔ͬͨ͠ͷ͡ΊɺʮΠϠϗϯ৴ʯͱݺΕ͍ͯΔػೳͷվमʹͬͯ#SPBEDBTU&YUFOTJPOͰ৽ͨͳΫϥογϡ͕ൃੜ͢Δ͜ͱ͕ͳΜͱͳ͔͍ͬͯͨ͘
#SPBEDBTU&YUFOTJPOʹ'JSFCBTF$SBTIMZUJDTΛΈࠐΉˠͦͦͰ͖Δͷ͔Βͳ͍ΫϥογϡΛௐͯΔͷʹ৽͍͕͠ग़ͨΒා͍Broadcast Extension σϦέʔτͳͷͰۃྗ৮Γͨ͘ͳ͍
9DPEFͷ0SHBOJ[FSΛཔΔˠ༰Λཧղ͢Δͷʹܦݧ͕ඞཁͩͬͨͨͱ͑4IBSFEʹEP0VUQVU1SPDFTTͱ͍͏ϝιουଘࡏ͠ͳ͍
#SPBEDBTU&YUFOTJPOͰϩάͱͯ͠औಘ͍ͯ͠ΔελοΫτϨʔε DBMM4UBDL4ZNCPMTͷใΛ׆༻͢Δˠͪΐ͏Ͳ6OJUZ'SBNFXPSLͷΫϥογϡௐ͍ࠪͯͯ͠E4:.·ΘΓΛௐ͍ͯͨ͜ͱ͋ΓɺͰ͖ͦ͏ͳؾ͕ͨ͠Mirrativ tech blog - ʲiOSʳUnity Framework ͱΫϥογϡղੳͷऔΓΈ
"QQ&YUFOTJPOͷελοΫτϨʔεใ͔ΒΫϥογϡΛղੳूܭ͢Δ Ϋϥογϡ࣌ͷελοΫτϨʔεΛऔಘ͢Δ E4:.ϑΝΠϧΛͱͬͯ͘Δ BUPTίϚϯυͰελοΫτϨʔεΛղੳ͢Δ ղੳΛࣗಈԽͯ͠ूܭ͢Δ ΫϥογϡΛमਖ਼͢ΔඞཁͳࡐྉΛଗ͑ΔखಈͰղੳ͢ΔࣗಈͰղੳ͢Δमਖ਼͢Δ
Ϋϥογϡ࣌ͷελοΫτϨʔεΛऔಘ͢Δ
ΫϥογϡݕͱϋϯυϦϯάclass func setup() {// ྫ֎ͷݕͱ࣮ߦ͢ΔؔͷࢦఆNSSetUncaughtExceptionHandler(exceptionHandler)// γάφϧͷݕͱ࣮ߦ͢Δؔͷࢦఆfor sigcontext in [SIGABRT, SIGILL, SIGSEGV, SIGFPE, SIGBUS, SIGPIPE, SIGTRAP] {signal(sigcontext, signalHandler)}}private static let exceptionHandler: @convention(c) (NSException) -> () = { exeption inhandleSignalException(exeption: exeption)}private static let signalHandler: @convention(c) (Int32) -> () = { signal inhandleSignalException()}https://stackoverflow.com/questions/36325140/how-to-catch-a-swift-crash-and-do-some-logging
ίʔϧελοΫͷऔಘlet callstack = exception.callStackSymbols.joined(separator: “\n”)// ͘͠let callstack = Thread.callStackSymbols.joined(separator: “\n”)
ίʔϧελοΫͷऔಘlet callstack = exception.callStackSymbols.joined(separator: “\n”)// ͘͠let callstack = Thread.callStackSymbols.joined(separator: “\n”)0 broadcast-upload 0x000000010502eaf8 broadcast-upload + 2239921 libsystem_platform.dylib 0x00000001e3b9c29c 987D48D5-3CAA-34D7-9141-C0BD6E2351E8 + 211482 broadcast-upload 0x0000000105106224 broadcast-upload + 11064683 broadcast-upload 0x0000000105103604 broadcast-upload + 10951724 Foundation 0x00000001991eb438 __NSFireTimer + 1045 CoreFoundation 0x0000000197d911d4 338F58B1-9B75-38A0-B908-E2574AB1D39A + 6722126 CoreFoundation 0x0000000197d90dd0 338F58B1-9B75-38A0-B908-E2574AB1D39A + 6711847 CoreFoundation 0x0000000197d90220 338F58B1-9B75-38A0-B908-E2574AB1D39A + 6681928 CoreFoundation 0x0000000197d89f8c 338F58B1-9B75-38A0-B908-E2574AB1D39A + 642956…͜ͷίʔϧελοΫͷใΛղੳͯ͠ɺϓϩάϥϜͷ࣮ߦߦͳͲΛಛఆ͍ͨ͠
E4:.ϑΝΠϧΛͱͬͯ͘Δ
"QQ4UPSF$POOFDU͔ΒE4:.ϑΝΠϧΛͱͬͯ͘Δ͜ͷE4:.ϑΝΠϧͦΕͧΕ͕֤λʔήοτϥΠϒϥϦʹରԠ͍ͯ͠ΔApp Store Connect
E4:.ϑΝΠϧ͕ͲͷλʔήοτϥΠϒϥϦʹରԠ͍ͯ͠Δ͔ௐΔMirrativ tech blog - ʲiOSʳUnity Framework ͱΫϥογϡղੳͷऔΓΈfiles=`ls "$1"`for uuid in ${files[@]}; domodule=`ls "$1/${uuid}/Contents/Resources/DWARF/"`echo "${uuid:0:8}: ${module}"donefiOE@ETZNTI
Mirrativ tech blog - ʲiOSʳUnity Framework ͱΫϥογϡղੳͷऔΓΈ$ ./find_dsym.sh /Users/naruki.chigira/Desktop/appDsyms2d4dd1c9: widget310ef0bf: broadcast-upload6d82e920: WebRTC7cc5d65f: UnityFrameworkb11f4f4f: Sharedde357eed: mirrativ…֤λʔήοτϥΠϒϥϦʹରԠ͢ΔE4:.͕؆୯ʹ୳ͤΔΑ͏ʹͳͬͨE4:.ϑΝΠϧ͕ͲͷλʔήοτϥΠϒϥϦʹରԠ͍ͯ͠Δ͔ௐΔ
BUPTίϚϯυͰελοΫτϨʔεΛղੳ͢Δ
BUPTͷجຊతͳ͍ํΛΔ$ man atosatos(1) BSD General Commands Manual atos(1)NAMEatos -- convert numeric addresses to symbols of binary images or processesSYNOPSISatos [-o ] [-p | ] [-archarchitecture] [-l ] [-s ] [-printHeader] [-fullPath] [-f input-file>] [ …]…NBOίϚϯυͰ֬ೝͯ͠ΈΔatos [-o ] [-arch architecture] [-l ] [ …]ࠓճͷΫϥογϡղੳͷࡍʹඞཁͳύϥϝʔλ
BUPTʹ͢ύϥϝʔλE4:.ϑΝΠϧatos [-o ] [-arch architecture] [-l ] [ …]ΫϥογϡղੳͷࡍʹඞཁͳύϥϝʔλE4:.ϑΝΠϧͷύε த0 broadcast-upload 0x000000010502eaf8 broadcast-upload + 223992./appDsyms/310ef0bf-51fa-3535-8078-3fa06c470774.dSYM/Contents/Resources/DWARF/broadcast-upload
BUPTʹ͢ύϥϝʔλΞʔΩςΫνϟatos [-o ] [-arch architecture] [-l ] [ …]ΫϥογϡղੳͷࡍʹඞཁͳύϥϝʔλΫϥογϡ͕ൃੜͨ͠ͷ$16ΞʔΩςΫνϟBSN BSNF
ɾΞʔΩςΫνϟΛऔಘ͢ΔͨΊͷ4XJGUͷίʔυIUUQTHJTUHJUIVCDPNOBSVKQOBEEEDBBCFCEFCfiMFEFWJDFTXJGUɾJ1IPOF ͷΑ͏ͳϞσϧ໊͔ΒΞʔΩςΫνϟΛऔಘ͢ΔͨΊͷTRMIUUQTHJTUHJUIVCDPNOBSVKQOGGFCEEDBDEBDfiMFEFWJDFTRMBUPTʹ͢ύϥϝʔλΞʔΩςΫνϟ
BUPTʹ͢ύϥϝʔλελοΫτϨʔεͷΞυϨεatos [-o ] [-arch architecture] [-l ] [ …]Ϋϥογϡղੳͷࡍʹඞཁͳύϥϝʔλ-l 0x104ff8000 0x10502eaf8
atos [-o ] [-arch architecture] [-l ] [ …]Ϋϥογϡղੳͷࡍʹඞཁͳύϥϝʔλ-l 0x104ff8000 0x10502eaf80 broadcast-upload 0x000000010502eaf8 broadcast-upload + 223992" #https://stackoverflow.com/questions/11747802/symbolicating-stack-trace-without-crash""#BUPTʹ͢ύϥϝʔλελοΫτϨʔεͷΞυϨε
atos [-o ] [-arch architecture] [-l ] [ …]Ϋϥογϡղੳͷࡍʹඞཁͳύϥϝʔλ-l 0x104ff8000 0x10502eaf80 broadcast-upload 0x000000010502eaf8 broadcast-upload + 223992" #https://stackoverflow.com/questions/11747802/symbolicating-stack-trace-without-crash"#BUPTʹ͢ύϥϝʔλελοΫτϨʔεͷΞυϨε"0x" + String(UInt64("10502eaf8", radix: 16)! - UInt64("223992", radix: 10)!, radix: 16)
$ atos -o {path_to_dsym} -arch arm64e -l 0x104ff8000 0x10502eaf80 broadcast-upload 0x000000010502eaf8 broadcast-upload + 223992https://stackoverflow.com/questions/11747802/symbolicating-stack-trace-without-crashελοΫτϨʔεΛղੳ͢Δclosure #1 in variable initialization expression of static AnalyticsManager.recieveSignal(in broadcast-upload) (AnalyticsManager+Extension.swift:22)🎉
$ atos -o {path_to_dsym} -arch arm64e -l 0x104ff8000 0x105106224 0x1051036042 broadcast-upload 0x0000000105106224 broadcast-upload + 11064683 broadcast-upload 0x0000000105103604 broadcast-upload + 1095172https://stackoverflow.com/questions/11747802/symbolicating-stack-trace-without-crashελοΫτϨʔεΛղੳ͢Δspecialized Stream.on(timer:) (in broadcast-upload) (Stream.swift:164)@objc Stream.on(timer:) (in broadcast-upload) (:0)🎉
$ atos -o {path_to_dsym} -arch arm64e -l 0x104ff8000 0x10502eaf8࣮༻্ͷ՝ɾE4:.ϑΝΠϧͷࢦఆΞυϨεͷܭࢉ͕खؒɾ࣮ߦʹ͕͔͔࣌ؒΔɹɾUJNFίϚϯυͰܭଌ͢Δͱ()[.BD#PPL1SPͰˠख࡞ۀͰղੳͰ͖ͳ͍͠ɺେྔͷϩάΛղੳ͢ΔʹΩϟογϡతͳΈ͕ඞཁ
ղੳΛࣗಈԽͯ͠ूܭ͢Δ
ղੳ༻ΞϓϦʹΑΔࣗಈԽʢ݅ͷΫϥογϡղੳʣ
ूܭ݁Ռͷྫൃੜճ ղੳࡁΈͷελοΫτϨʔε͜͜·Ͱ͘Ε֤Ϋϥογϡͷ༰ͱӨڹͷେ͖͕͞ҰͰ͔Δ
ΫϥογϡΛमਖ਼͢Δ
Ϋϥογϡͷमਖ਼ৄࡉলུʜɾ৴தʹ4JSJΛىಈ͢ΔͱɺԻσʔλͷྲྀΕ͕ෆنଇʹͳΔɾ৴தʹଞͷ௨ΞϓϦͰ௨Λ͢Δͱɺఆ֎ͷνϟωϧΛ࣋ͬͨԻσʔλ͕ྲྀΕͯ͘ΔͳͲ
Ϋϥογϡमਖ਼ޙͷΫϥογϡͷվળमਖ਼൛ͷϦϦʔεΫϥογϡͷൃੜΛݮΒ͢͜ͱ͕Ͱ͖ͨʂ
·ͱΊ෭࣍తʹಘΒΕͨͷɾΫϥογϡͷৄࡉͱ༁͕؆୯ʹ͔ΔΑ͏ʹͳͬͨ͜ͱͰɺɹमਖ਼Λ͢ΔࡍͷϝϦοτӨڹྗͷࣄલͷઆ໌͕͘͢͠ͳͬͨɾܦݧ͕ͳ͍ͱཧղͰ͖ͳ͔ͬͨྖҬͷղ૾্͕͕ΓɺɹଐਓੑΛݮΒ͢͜ͱʹܨ͕ͬͨɾελοΫτϨʔεͱE4:.͔ΒΫϥογϡͷৄࡉ͕ղੳͰ͖ͯɺɹΫϥογϡͷղফʹܨ͕ͬͨ
͓·͚DBMM4UBDL4ZNCPMT͔ΒऔಘͰ͖ΔจࣈྻΛύʔε͢ΔͨΊͷϥΠϒϥϦIUUQTHJUIVCDPNOBSVKQO$BMM4UBDL4ZNCPMT
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ