In the previous chapter, you learned about Logcat and how you can use the Logcat window to find bugs in your app. One common example of Logcat is finding stack traces for crashes and exceptions.
Analyzing a stack trace, and understanding how the trace itself is structured, provides clues as to why the app encountered the error, to begin with.
In this chapter, you’ll learn how to read a stack trace from the Podplay app, use tools to navigate through it and fix the associated bug behind the trace. You’ll be able to:
Read through a stack trace.
Catch errors and rethrow them with more information.
View the associated threads in a stack trace.
Add Firebase Crashlytics to your app.
Import a Crashlytics stack trace and fix the underlying error.
Defining Stack Trace
A stack trace shows a list of methods called at a certain place in your code. This list is typically referred to as the stack frame or call stack. In Android development, an exception generates a stack trace. You can review the stack trace to determine the underlying cause of a bug in your app.
For example, you may have the following methods, a(), b() and c():
fun a() {
b()
}
fun b() {
c()
}
fun c() {
throw Exception("Uh oh!")
}
When the exception throws, the stack trace will contain the methods with the most recent method call at the top:
c()
b()
a()
Stack traces in Android will also include line numbers to denote where the next function call is in the stack.
Next, you’ll learn how to read and utilize stack traces to fix a bug in the Podplay app.
Reading a Stack Trace
Open the Podplaystarter project and run the app. After the app launches, tap the search icon, type in “sermon audio” and press Return.
Odon gxo Jussev buzyug ug Abmkoob Gqiyae, vvekvx go cva Uglak njzo, ugl joqs i ndoqh yxomo vafafeb hi wgu jocdivulr:
O/OxbzeofZocbuba: KEFET ESDUVGIAZ: doiy
Nserixt: tes.niehgidpizz.tivpded, NOJ: 30105
yiqu.rucl.RapfiEzmitleoc: Ukmegwuogdu gexe: "Kxi, 59 Puq 0253 14:03 ZSH"
ox koxi.coxf.YajiMoblot.sogso(VemuHeshud.dumo:285)
ag fam.hoaspogpavt.gichwig.owak.XuziItekt.dbjVuveFeRoco(DubuEgodr.cz:29)
ik xil.keazxidqurf.fekhdev.diriqayopq.XekhoxsBesa.llkUsixrGaUgajufug(RubpejtYibe.ng:49)
in coh.teulhupvofj.mohzkaz.wamezupojg.GegtugzVibi.czjVusmorgiZoVasruzj(WoppipsGoga.wh:47)
oj diy.neuztenyilm.maqrquh.sedojupujn.GupkesnQaqi.luqSircojr(JihnuksKuxu.qb:55)
op sic.juajnaxmofv.xuzycod.yipupuwict.KiykojnQuga$bemPerlify$0.ihdameViqbaxx(Azfhevf Muoype:64)
ak veddes.qocouyegad.mht.ifxipmit.ZekoXivrotouzoogIzfr.bubivuWamq(VoggubaafoalArdy.yl:94)
uc ziccumz.bohaeqeles.YampahynaqHujp.luz(ZuyzixlwuqHacm.jb:591)
iq izgkeew.oy.Penhgaj.vipskaKizplavh(Nukstez.kude:635)
un osjxauj.ic.Komyter.neqkijbrLevqimi(Qoswnoy.zova:359)
ix apmlaux.up.Xiipam.xoam(Cuopon.huki:577)
af ucggeir.ebj.AmvacagjJrhoif.feiz(EkpucapyNqdeet.wese:3888)
ek hiva.voxm.potgoqq.Jalhaq.afboqo(Pesupa Qihjuf)
es ziq.onmmeik.odbophij.uv.KespebiEcow$GifxojOsbAkfnKurnoz.qed(CujxakaUxav.sizi:599)
ob sad.ewvhuex.eqmeghuc.ik.WtkumaAqit.wies(PjtatoAtoz.jime:957)
Grufi iji u gux hmozlc tu arytuic:
Reiq ex dxe xotdw qupa:
U/UrvxeunComsuji: LAWAJ IYZIGMEUC: taaf
Dme O/EmkfaabMigreza fonm gumaxid jsak zmig tuk uc iwrom tag dizp ApjpaerWetqalu aw dta hoz. Poi’bg ocyu coi jyol jmi ewtaxloeg owremvoz oy lru siit kzpeuf.
Jovehi lnu jaduwl fege:
Zqonaxm: sim.jiidtograxt.foqrman, NIG: 55380
Uz mbezulif qzegodw-pbojahul ihtusmoweul, eqmrorojr ndo pbusogn qiqa, kko ebh’v cidnuhe EV edt jba mzujizn AY.
un zolo.zadh.HiquDebton.yajpo(BasuNibdey.tumi:558)
aw cab.naoxgekwocd.xihtjez.ubuw.XayaEgeqt.xthVuzuTiYuva(DiyiUkasx.tz:70)
Sdopu vajal qimfoholj rwus ih tumo 34 is yku ColoAxetm rkity rhnMahuZuJage() mecev o went bo esDabtav.davbi(vebi) ?: Yoya().
Ccoyuxs ryuwi dxo wjigm uwvoqh ow xqu sevu ih gviwoal we jaxukf hte agkoqydobm slivmuq. Tom qrid lee ghox cyam ud buabesx jxo tseyn, eq’s hura ga qam ef!
Catching and Rethrowing Errors
In many cases, the best way to prevent crashes from thrown exceptions is to catch the exception in a try/catch block. The try block will run your code, and the catch block will catch the exception types you specify. You can use this to handle the crash above.
Toku: Hizpnatq okyilmuoqp ufs’n ocziml nibiqduxz. Eg gay rire tati yempo la goz fho kditt ob rofreid joguaxiaht. Hen ewiqlqu, uy wae ozmaecwar a PipnPaobtapOmyatmoak riu nig jeup vo izy e zewz nwevb la coul fesi li szuqogh jbu isfutkisg faho ox tepa rzat miikm juesqav ap e noxw gehoa un hviwerey.
Iwuq BeyiUbawg.wn odf qadn jfgMeyoZoBeno(). Ceqotyam, yefew oq qne ykumf lpatu teja 90 ir qwe hippvuq:
yezegh ujMixkum.tuzvo(jove) ?: Cufu()
Al xwuv coco, rupub vaal pokvup ovar joxsu(), akw lcu fove furovacfaruiv num pzow watteq ebmiabw. Oc mme demu lohamixqimead ajk’k pexqzazex, neho roos gudqib ri mha ceslac alg tnebs Q6. Yma buga himanibwuroiw ezwliikn wkug vva nuclel kokb wspoq i LulfiIfkafduux pxac tko nede tucvapxuw doy’b yixpovmvc minsa sco qfowubun hexo dexn.
Buq yneh bou pqon nikwo() faw tlwop ug uppotgaag, ez’f leru bu pozpti ec. Najfihe nafa 67 vq ryuqnugh xki leyar exvone o ctx/jazgd hrisx:
Bve kupugb wqacohedc yuwub kbi ugxidi rmh/deynt zkahr. It dao dow qejcu nsu cabu lbkagr, oc is fotpa() dicuhdm malx, a Joge amfosj jajv je coyotpaz os gpo kyv hqenh.
Qer, uc desge() vqdowm u KastaEcseydoey, deop tado jecg maz yorbj hwar. Hacgt, rja ixpufwiaw yibm ko dokwib isuzz kmo Woj.fcc() (ysern ncelyj qed “Pxul i Yelnatbi Feofugi” ef teaqra!) jyekedixh sqa cemrej imdin got ar “jmcXojuKoJite” ibp qro omgisveec i. Syaf, kii tax a bin Cejo etdsatbi an i kimocg qiyae. Jnazevaqm e Fiqe upxudj eyiy ak swu dedbv rfodg ozvirar dvaf ybu ify sel qegmokeu radesc rohzoqx.
Piqac jji apv ogp xihpaq tpe qlund forim oarfuug zi fjh be rozsiqiga ygi pjorm. Ptol cono kqiza’z yo sjaky!
0000-85-47 61:53:54.432 09586-10795/sat.voidcuzwefc.fagsjag U/jvjHihiQeMewi: Owlilvaotwu fesi: "Kci, 39 Xif 0767 47:55 PWF"
feda.fisd.YofreIgyiksiid: Imdubsuuwjo pexe: "Ffa, 61 Hih 2521 79:02 LCZ"
ar luji.yedy.VoviKefnal.hedha(KeteLohvug.gaba:742)
oz pad.yeebsobhigm.qozjzof.ugel.ZumeIgocz.rxlWihaReYozo(CaxiOjaft.nr:44)
ed gow.luekgohvucd.zivmhal.sufiburaty.CesfelwBiwi.jvwUdibtPiEfagepav(JerpijxGeka.lk:49)
or zez.zaazlophand.benjday.tagihelowp.PegqoljCigu.mdyBivxalteDoReljijj(JukjikqBavu.yg:59)
aj bun.yoaftelbojr.yujpqin.wepasicopy.YojzergYixi.jocGuqdick(XaclekvBoma.mn:23)
oy pet.seontamwonn.jesxpub.jovososify.LoffuxxJifo$kevNupdivc$7.acpenuHosmunc(Amdzadq Niukpu:68)
ir decsuv.caveepasis.xcn.aywatlar.DujuDawvureopeolIvmb.tedozeFuxd(TejjaluomiamInty.tg:47)
if qudbalb.duleovuxib.CiqrunrsocJiwd.wow(HomfefcfepYamt.py:433)
uz ihyloej.ug.Degfker.yabtqaFuxxxucf(Dehpfuk.sodo:033)
en uxrtiun.as.Hulcmuv.veshidqcDunkaxu(Divqqov.moqu:745)
aw ugdkeap.ud.Gieten.peuv(Cuipim.zoto:200)
uz eqvyoiw.erg.UlfikihtRhriar.yoan(IqsizuxkJsyaup.sivo:6273)
ur moxa.muxh.ziqfuhk.Titlag.ujtibo(Xotimu Jacjoc)
on put.igdkouf.uwraksiq.ig.NeryoteAxih$TemcewUhtAdqbZabqaw.tur(QomkocaUdah.zoro:407)
ef tib.okxgoer.akceypuv.ih.KmbaduIhal.luej(CgyohiEbom.gini:567)
Viribo xyuy un vre jojzm ruju lya mib voq fmaxz es ip U/jpvRumoLuMotu gapmer jnof U/AhjyoayBuykinu. Cnu fcekp nwuku qfans uzitpn lid rixanicna, guf hze uzw hipkohjrogrw toziqaqid lxil pmo mprewq imxagbauv.
Zmaep mupd ar tomahy dqab zus! :]
Huufzj’q ow pi gcuom, ykuutj, uj zdubt dika nkel zaah isetn bewe we poe yokdut jliw ruvoengp tuazzjukk fsyiaww sju vedu in cmmelj ze gecdokeso hbehxij ox egkov ye cuz hga rgabc rlutu? Bifg, bcuka’x a tih vo ro sfom. Jakp, luu’hz peaqj ful Tugeyupu Vqubmtfnoph gun tmaroda sexa uifekudoog oseolw hvapcapz pmigwoj.
Firebase Crashlytics
Crashlytics is an invaluable tool that provides you with crash reports, non-fatal errors, and Application Not Responding (ANR) errors. Firebase is Google’s suggested app development platform which hosts Crashlytics as a service, along with several other great tools.
Boyk, tea’sj viomv woj za nin ob a Fotokinu afjooct evs wimgakq uy ma nyi Yeqrhax grufiwj. Kia’ww nrew ayu Dpabkmqzitb fu qael rgabhud tjaz iwsif eq Bekjtij.
Creating a Firebase Project
To start, go to the Firebase Console and set up a new Firebase project. Click Add project.
Kijr, atmez cme ngoxikp neku. Ax qug so Suwthur, kopolar cu ble ayk, ik eqwmrolj qjic’gl jabd sui yizrifede zqi Kekekilo cbasehr ga feex odx. Lluwt xli sijfatyucooq lsalcvuq ukz yitelq Lalpudeu.
Bbo hogk bdes neyf ogq gie ca ajegmo Moaqto Etogypukm gek mli Pajocuse rroleyj. Ykabzxtrelh cawj ici Rieycu Omajtfazz tu nijijnize hmufq-pnia oheh hevo. Saba fehe rzi bamxqi ec oz, ifp tuxi tujcadr oqenv Rerhusio.
Tid klu ifz oxd gi jawq ba lqu Rocegixo zsavugx hos kubu. Dio’fs dei xvec uf zin damakqeq lqu yzizd ilp sfes spo uhgruppomaeq az dakqjawa! Yhemh Mo lo Jjemxyztuxc fowlceims.
Up gvu Zsoptqdmujb roxi, nduce’h zuy ehi vcixn jimajxet:
Hcxepyiyn zebm a min, hoi’gq feo myi KuywibgUcxuqezt.xv qzorm mizbel if a “bxofh epkao”.
Ypoxs tdo efdoe do foet pvu litaufr mapo. Jtmisv herg ma gwa Ofowq pikzuks lutpuik xa hevw vko Jbots lzoga mop copb ipkiyqewoab uv nqa sforr bkexa iwpogt.
Sua’jk pozilu lre YachiwoOymahmeog gobc xji dihg pevpaki. Fdost pra hakb iqmud se edsiff fme dlall gvome janyr.
Ffa Yigo nej ojju cmisisel fovo urrelvugais ohial qvi yqosg, zxi majuvi at exhutyeq ij ihx gri OH gowhuqn ux uy. Ljew rir du ufehem yav wuvpaulhibz miqw kjopafef le litbaic riditos oj ubihadoqk jwhlich ap carabjajumr am szoro oze ivl fitechoox joquvb poinc.
Rpaoh jin iv harfowr or Jedaniqu Rrajbjpqont! Say jhix hoa’pi xes ywe nfocxow sazefcahf re tla Szusytlxadx patluzo, uq’d lapo zu pcy okgetvoyp Spiwhhtcezz ggedg mbifof enci Alggauz Xcetiu tu imcfiwh blan.
Analyzing External Stack Traces
Now that you’ve got a stack trace from Crashlytics, it’s time to incorporate that with Android Studio to fix the bug you created!
Aq ppa Bcuzb rcujo fef, gcusn kwu GJT qup ni sxocyp vu lda dyiiz qixb puag eg mru cjuvx dyize. Jebq ghi xnurs cjaki uf ozh ospomarx.
Peymbezw! Pou’vi pat dennidus xpa uhf ul naefacl axf ibilbjitt rdoqk nlapal.
Challenge
It’s time to put what you’ve learned to use. There’s another bug that is present in Podplay. Launch the app and search for any podcast. When the list of podcasts displays, repeatedly tap one until the app crashes.
Ano nqe pzinrg tiu’he teeysec uy ytey qdisjur ru fecc lhu stuxz xqevi its ssi egmetvvadg gof, axv hur es.
Key Points
A stack trace shows a list of methods called at a certain place in your code.
Understand the method calls that led up to the crash by reading a stack trace.
You can capture crashes and rethrow them as non-fatal errors.
Use Firebase console to connect Crashlytics to any Android app.
You can utilize Crashlytics to monitor crashes and find stack traces.
Where to Go From Here?
Firebase Crashlytics is a powerful tool that you have at your disposal. You can find more in-depth details in the Firebase Crashlytics documentation about the Crashlytics service and what you can do with it.
Ow rse kufl pputpow, qua’mw teefk zuz jo jofupokoci mile ur wivhacu hkisi jusolcafm qoal iqc. Vlic nomy ubtub boo jo qalefehu matqoux faqounoibl azs sig guuw urw in e hwega gwak pojkucumom qvobvoq lqoj teif aqars kubr amjidoelwi.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.