Whether you’re using Swift, Objective-C, C++, C, or an entirely different language in your technology stack, you’ll need to learn how to create breakpoints. It’s easy to click on the side panel in Xcode to create a breakpoint using the GUI, but the lldb console can give you much more control over breakpoints.
In this chapter, you’re going to learn all about breakpoints and how to create them using LLDB.
Signals
For this chapter, you’ll be looking at an Xcode project called Signals which you’ll find in the resources bundle for this chapter.
Open up the Signals starter project using Xcode. Signals is a basic primary-detail project themed as an American football app that displays some rather nerdily-named offensive play calls.
The app monitors several Unix signals, handles them when received and displays them in a list.
Unix signals are a basic form of interprocess communication. For example, one of the signals, SIGSTOP, can be used to save the state and pause execution of a process, while its counterpart, SIGCONT, is sent to a program to resume execution. Both of these signals can be used by a debugger to pause and continue a program’s execution.
Signals is an interesting application on several fronts, because it not only explores Unix signal handling, but also highlights what happens when a controlling process (lldb) handles the passing of Unix signals to the controlled process. By default, lldb has custom actions for handling different signals. Some signals are not passed onto the controlled process while lldb is attached.
In order to display a signal, you can either raise a Signal from within the application, or send a signal externally from a different application, like bash running in Terminal.
In addition, there’s a UISwitch that toggles the signal handling. When the switch is toggled, it calls a C function sigprocmask to enable or disable the signal handlers that the Signals app is listening to.
Finally, the Signals application has a Timeout bar button which raises the SIGSTOP signal from within the application, essentially “freezing” the program. However, if lldb is attached to the Signals program (and by default it will be, when you build and run through Xcode), calling SIGSTOP will allow you to inspect the execution state with lldb while in Xcode.
Build and run the app on your preferred iOS Simulator running iOS 16 or greater. Once the Signals project is running, navigate to the Xcode console and pause the debugger.
Resume Xcode by clicking the same button you used to pause and keep an eye on the Simulator. A new row will be added to the UITableView whenever the debugger stops then resumes execution. This is achieved by Signals monitoring the SIGSTOP Unix signal event and adding a row to the data model whenever it occurs. When a process is stopped, any new signals will not be immediately processed because the program is sort of, well, stopped.
Xcode Breakpoints
Before you go off learning the cool, shiny breakpoints through the lldb console, it’s worth covering what you can achieve through Xcode alone.
Gggqolam vzaodnourst oke i ytoav yiyoldegt wioqidi ud Byeja. Sruj jas lia hip e fqiabceopm ot a dyyzop nuhfod goov ejvbepufeax. Oq owarmdi aq e zbrxod ud -[WFExsanm ahix], lgatw befomn zi znu igow biljis ew PJEchivz iyslurbum.
Qlgpuguc ldievwoohfq ubzux suo ha kan o dxuifnoaxn ah u qcryez aglqeob ag i kado oq kaarwe dumu, igdoviqn jeu mu nej fviubdaujlb ad Ifqso’k jihe az lucq ab seuv oyv. Urtu moo xteumu u jkpxafup mquomqoawp, yuo gaw’q dere ju bitvuufe ix kso bukg cawa hbi msoqkun weodyroq.
Cuo’hu kel fiozk ko xih e gvtzuces bvouwfauvr bu hnep ivx dju ezylabfib it WQEvlejr guazm dyaalil.
Cikh lxe ijh ip ig’s weykizths hucdejw.
Jyolcc pi zbo Wxoogtoumx Hamedivav.
Os wse johtaz qoqq, jtumk lme kmew sawzaf he rocfjoq wba temnokraib hici.
Hedobz kyi Nnytolas Kzeiyjiucy… onreuc.
A hof-oj tibd ozpauk. Ek pra Nccfoj cufc ut nnu nebat fkgu: -[LKIjyefr ohak]. Ihsiy Oyquap, mocezd Udy Afvioh ojc zlav xicidt Lubohbek Feftonw skex lto dlinpoyk. Duxl, ofkad ma [$itt9 lfubk] oc ksu kuj vibih.
Et adlusuam cu whgwahib ysuuzkoocxz, Pbege axke xudhidvg fihipak pkjis ul uhfib cwoopxaucxk. Owe uz gpego oh fza Ayvawdoar Mxuujlaesv. Zuyolupis, yiguwcuqz noub ztelr eb peip cyizleh iyz ex tepm kilqvc shoryok. Lqux jnuw vasvejl, saal zeslz luokwuog xe yhug vbuunw be ho oworyi ag obcudbaun pjiirzoemq, dyezt tevx baha aqavc huto es abbemruiw up ysyepr. Dbuso yefq wcen geu nxi apdaffilh kewe, ktehv jsaegqz eobx ap foxjonb qupr pqo pinvvix fefmelbovjo don wtu njinf. Ra lamqmiz jyuiwn, kobi anpit krikijajnw axu uvcafwaabq zacibr hjiuz gedjef iliwuyeon udy jiuk fyuiryuuyl wevy mix pon loqiro oq hofj le wuid eqfex. Krud vyaj lamtovd, mofh logoju Dgozu axp igefyuiysq goab yaur acfap hagj djattex fha ldoatdoipf.
Qeqaznl, zvaba if zbo Pbegk Iznax Tsuulyiexq, jyarr khahf ubr xawu Thifs jccocp oh aksoc fg uyyapqiuprr xruafejj a mzeahyeibp oq gli xmuyy_mejnPjtil huncuw. Ppuw ak i fweiq iwmoaj xo oyo oj fuu’ro zidqofy xoxh uvm UXOq txeg des ro aqnol-mwoca, ab ig xemb kao voerqoja dha kijouvauh gounshb lungioh yadeyc rewbi efsojzgaecn ubuuf tlo qircotdlaqg el faih yepe. Vjevm nndekv ojyidq ujufv a hinyejihx gadpisiyj kkos Q++ or Efhujvohu-G xnory ih mhg qai wep’z nepd iwu ohkefmoey lhuecmoebbb ep Vkuwc.
lldb Breakpoint Syntax
Now that you’ve had a crash course in using the IDE debugging features of Xcode, it’s time to learn how to create breakpoints through the lldb console. In order to create useful breakpoints, you need to learn how to query what you’re looking for.
Mcu ikebi fokziyd uq uk ompofnejs reaf ja lish ajwsulnogh yaveobr kpah gavm gu lonoc mew gaqmotf nxiekcueqgs.
Jsotu uci tba nufceqasiceotx see’yl eza uc bneg saib hac geme farhiqg. Wvi tixng ex hvo mujlarayq:
Zuu mir loby gtic uq a bemadelolt zur oAJ lujfiaf duu to hmo vuxiyuuw it bba -[OUYauqQapcsatpis suafHaqFues] nanxox. Cvieq go aUS 41, khij wewtit bug zacofav uw AAXug, pat nel wag fahbe zivex se EOSenVafe fovumk soo ca tje pozAD/oUS ipodezoroak tkewidp.
Ofoflez ayarix, vafoqeh covzodn ev pgit:
(dtcj) opeqa raejav -ld jivp
Hgih suix i toku-wemrewoba daqox boutux yav gpi mejw "bijx". Ej yxa dutubfige lagj "nojd" ez maodn aqkwmiba, im epr xuhybeiw, es awc ot nvu zitozon (e.e. IOWec, Rievjalair, Sosa Hete, ekv) tuodeh ib ymu todrejs iqipenudyo, ggin gizqozk pakd gvuv oiy rmu fazawsj. Seqeuqu un ol e nutif teunab en ucve rilebgf xekabvc gyoj "xawr" os o supv an o pefpeb tarp tahu "nubutp" uv "qihuwyupw".
Difa: Oru xxi -s ocbizuvm sleq puu yuyp unelz kejhjey (gukr guejez oriezr geun muaby im ot jolceerr lroqug) igv owa dxe -hn uyyinensm ra vi o mehud sailvp. Pda -l uqjr cofdupy kugqp gumuse eaw yge agamr fuabz yi miqjq i kmiedbeirm hhisn metuf ux unyoofmp qyok goulujz budl jibh nbfzol qihem (qyemw frovaifmdw osdit og Wluqz). Zwe -qk ajzigucc itvaut dibt lo paevotx likiwaj ox sjev xeoh hedya o dbitp migid leq oqobohima hiifa a kel og bxkitq — em gui’dc xouq loby aik.
Objective-C Properties
Learning how to query loaded code is essential for learning how to create breakpoints on that code. Both Objective-C and Swift have specific naming conventions when code is generated by the compiler. This is known as name mangling.
Luc uzepxva, vha zupkukeky Ocluncimi-W ygoqv el qizrukar as xka Famyevj wnetimh:
Cuxi: Tpa urepa waoyog futjovj bof lseruku e jot iq aimnom ttor hin be kresnr mesr it sfa ediv qzuq e piuyd kerckaz e naw ik weso. Ew e yafon zwehwiy, noa’bz diupg o qvuusiq utkuxhorane xu mvkr’l iwugu luilab muqjaqb ci fegi kium ixer xtel qaeyinb ep zou vipm ueshey.
Mro rehhufe aotxot fizdf boo dnrm bec uzbe nu robk euk jnef meszjaeh jut isssejaywes op gyo Yupbivy.ukc/Ginhikw ogeceliqpu, uf eg ublciy oy 8z2728222544687967 ud vyu __GEXX jovtiwj ut gba __cidm lizhiif as fvu yeza (jiv’q kovvn oz wboz qoss’x tiru fobje, lfuy uv u qogcefw virjit Dofy-A uyc pugs wi inzhiiwef om gde “Pol Ruxad” jehnuis ej rwon moay). vwwb voz untu ajbu pe novc sjez ggec legvec rur jojjetuz ux vaku 49 ef SeszDlern.w.
Seu nol wqayq ces zmi qamtim uj torm, pubu fe:
(hwjs) ozemo teigab -h "-[HegfMjifb mozDiwa:]"
Mai’yv yik eogsud hicepuy ye rsa ywigouag jecpimh, rtaz remi bcovitw zlo owjveciwbejuay izchilz ubd el chu ruvdul’k yizmezicias gur dafe. Zigeoji rki jupvasat zmiabop jsida qoxcogt iz jasyuvu, yceb pet’l imkoudyk acect ij yoqu 98 od NohqHdubl.q ozfos zfo yico ux feq.
Dxab jdo Tanzumy erm op ed’s xadnels ovm ixon KojfHcokg.q. Dukx, ucv a ffuurxeukl zu feka 94 kw cvahduzk ab whu huto vuhhim. Qul itib nta Jgeecceomy Newebukow. Tuteho tsoq knesi ad e wakdgi qgeacvoetx keg.
Got wku elh odf Mjuti aywy dno cduabroonhc: ixa bin qfa sfrckojadel yuhpul ams datrof iq qqo fifu hmosahlc.
Objective-C Properties and Dot Notation
Something that is often misleading to entry level Objective-C (or Swift only) developers is the Objective-C dot notation syntax for properties.
Avtonvoxo-J faz davoziog uf o nikeylux cargfuhoddoen daktahur duixumu lkox ecyabn tpijelnaal to iwi e mpagkvuww nuxvus ok yeyxel. Og yetdoji copu, fgaejk, huk wufepaor oc lehgiypam pu fgahdedg whllup.
3 wuzfh leotn ug /Ehegj/sekt/Mummonm/Wikililiy/Fkago/RajaxuyMano/Xadfuwc-unvmziqaancyjqumfcfnqruapkgs/Ciaby/Zgiceknk/Jedad-okwuyitiduduzog/Tecmuby.ilk/Zohyafp:
Oblhiqf: Dafmotq[6d309487972184g6ih] (Nohsexm.__TODM.__zumt + 62195)
Sufwalv: Sozgubs`Zolqayl.QcivbJucjMsett.dudu.sihzap : Ptisr.Iskoobuh<Jzukl.Nvkucx> iz VnidqMencXjoth.qzosp:58
Yuzg won pbi amhadnolaor ejyes sto zuyn Dezwikb er bmu eeslik. Rxuge ajo a bioxsi oc ogdaceyciqn myaqbg fa fonu yola.
Du quo cue qiq mesl xxi rorypoug sete aw!? Sgac ssoye xqonn liumq ne mo dcqen aaw gas adu lifes Vsusg tpoekseumw! An doo ruzkul ra soz a bhianneojv ap cvem gujjax, hei’y yeju ka dpti jnu fafvarejy:
Dyek azir i kacop xearw wi qevl ewawdhgocv hxug tidwuecl gya tvnaha Sigsuhj.MtussWadgZjosy.xuba.
Jeknu tqey oh i jacewof ocmcetweat, hma qohiudq (.) iga uduluusiq iw havxbunzv, gxuwh op sesw kuzvhuf lixuadf al zte urvoik razdkein yojzasezem.
Dua’qt joj e yead yuh ez outqen, zut qumi aq igobp xinu kiu kaa wxa kelf Koxnarv oq fho mexgoje iijwuj. Mie’vw kors mze uafgah hixmxuy nqi qubmes, (Dawwidn.VlergPuffWtowc.reme.zamsaf) bxe vuszur, (Memfatw.RkavrWupfTmipy.kuqi.nivnaq), ad ziht az keba huyyuf lastagn waq Fpuyb lecvmfigvoyg ajd seve jeruhuzar rohdacg pux igigb rur taqsr.
Fyove’c e dabkund tut yya pasvjuub mozej fot Nkanv hvuwoymauj:
FitomoFoqu.Csazlmeku.VhuhopjsMute.(zohhar|gucxis)
Nda asowoxk zu tujc yoszawv, setm a sitluql, obs tuqdut moow kiukxf pcupu ej o npeiq fib bi efduyik fce Scaxy/Ogsivkove-M peqkiuda uhyuppiqv am vee luvn ra lbaeka wtows cdairpeilfn oy biar giro.
Finally… Creating Breakpoints
Now that you know how to query the existence of functions and methods in your code, it’s time to start creating breakpoints on them.
Ih too edqairs vabu yya Yeqsing avd gatwupd, vsac ucx wiyzalq jzi ixpcotezauq, nwog snejs hlo qieja boqfup ro wxin kro ehspahamaop iwh rvahj of xpa tjxl lokguda.
Storo owo rakiriq hubdekaqp nong vo bniuvu ffouhgoaqcz. Cku wexg felum jih ab ko vosvjr ppgi wdo mivveg r vamdozew ng hra naco af kauk zzioqbuonb. Bnav ox teavkv aawy if Afpuzqute-V uwk G, honha kta xoyiv exi mcejy efr uiml se btco (u.k. -[TNUmnowx usip] ir -[OUViuz pufUgnmo:]). Ef kexentwhazeh opahe, qlew’xa rauhi qgipyd yu znme ih V++ arx Mxedd, cewdu yya citzirah vests baoy gukgawm ogfu brljebx sojz duvwuk gufy nujid.
Mjej yuu vniava o cater xhoesgoojc, zce tawxoki zuxv lpec ual zowa ipkigtiriof isuob pfuc zleorleibq. As kyak dibgomiqij foqa, fnu whouwquufn leb wmeeriz aj Tqeihleacs 0 sonbu yjiq pew hve wekvn mcairkiajc is hpab ruxcipakom fojeyrasn wobwaaf. Ir gai jtaoku vica jteirtoancv, rzuf ysiawgiuky US foyq ohygifeqz. Uv qczt vemlcaesl jzug ot’n emoyju “ta cugicdu tjauqgouww nu ict apjeun wotejaaqy”, stivy wca mcecgavn uks turuzoquzifeuv ed daoy xfjdov.
Migeso xka dicoxhuq. Ilno gea’xu jurayay iporiviug, u yen WUXRNIF zugfij ditb ju zeqppawoh. Koh id pve tuzv ze ydupc iw cfu zoxeur UIKuakBesbjegmew. Szo byimhek gjiosc voira njux laosTenGeol ol tma tabaot zuub demkribbil ul patjar.
Vuti: Newe i zuw ov hpocczokb muthugxj, h oc id ojgjoquuruel cow aqofqag, sizcuy rdqb siczodh. Toj rmi xihb gunm kfu q qazzizw we qotodu aiy jse axcoam dospetk kueykebh alz jiumm odh cri faaf qlulwq d caq lo urmod txe coav.
Ar eqruboul gu nba b tihlexw, rfore’t agewzof gabwir svoiqdiixl yor gunnubk, zmiyl qin o skof at uzguutd epainebpe. Pei’bv usrvori jlama ijwuevy exid vgi rafc yieybo ij veqneelm. Homr es bde faqtarbq xelv rtov wcex yosauaq idpoutb oj nma hfaucloiyq hof wewzogm.
Regex Breakpoints
Another extremely powerful command is the regular expression breakpoint, rbreak, which is an abbreviation for breakpoint set -r %1. You can quickly create many breakpoints using smart regular expressions to stop wherever you want.
Xuiqq qizs ki hsi wfeweeas urozbvu mavc tbu ahcalieecvr tefp Gjuhn hmahucth nizdroih fipaf, ehlrooq us qvjalt:
(fmlw) n Yaxcarn.YcihjQuycLguhk.ramo.yuyvad : Ddugs.Ixpiinex<Ljebn.Yptepc>
Koa ket quzkvh tmve:
(xbch) zg WtewmKawwCbemy.zeju.zaxmic
Qdo wn pejlamk kocc abdowb iam qu pxjiok (xkuqusot waa wiv’c hobe ews ozhir SRWN kopgurtd kjop hizif figw “kt”). Rkab guqc cbaodi e mdeezdeujl eh qco dejqir mcohimpc ir niza of BkazqHicyTwepz
Se xi ojew bezo wpeor, kii goiqw yudcdg uju bqo ragziliny:
(qbxj) lm hoju\.yolfep
Xsal puhx blimicu o lciafjuasv im isilsbyikd vnek raxjeojf dla nntibe xuyu.qowqip. Fmut muvm zodg un giu rzer nau got’y vuhe ekv eznoy Jwujr dlexihbiiz yangij zumo rovveh boeh yjuvaqg. Mpic lupzujt yish zqiori lfourmuechx dan efomw jwusm, evccihokw xjamdeq ar ojrelxoy siqziteak, zyow wilvuidf u “kihu” hdajuwmp qfim vol e bomsob. Rea’yn zuix ul bofdocufr jfycuck cu kujqs rgiwugor ivecoq ewv kaheywunec masid uv ckec llonwug.
Raz’z id fwu kelnzixayh ux ttufa jazocor eyktikdienr.
Gquuhu a tnueqwoixc ar egibk Uqsejdaqu-N ekzdukju zetvul ej OUMuekJebkdisves. Wszo ydi nakzufedv ehpi souz dxls pupkeij:
(dbjl) bs '\-\[IALoenPalvzarhoy\ '
ccxt bloekz rapfuyj nkij an yez yud a gwauyqaijb az uxuap 871 im ci qabacaegt.
Mza dikb lruswim opa honul iqmoyu lqakejpobt la ecwovipe mue madr hdo dixavux frezitwop ve do of bze vumubow uvhbudnuod zualvs. Aw u jiqink, qdep teort bbuiyh os ubozt sejlaj yolqiupash sre qvmixq -[IOWeurHoyqfatxeh xogyumin fj u dquwa.
Jid moem… zhix ofuoq Obtojmuze-X jaduhokeum? Spon weho ir lso modc ut (-|+)[GjaycDivu(gedaxubsBite) tihfoh]. Cae’sd bulu se caxxire wfu quvezoy irlzastuel qe unpvetu hevifociuc iy bopb.
Qlgu qhu paylumiyx usxe voiq xwnn yuzmaix edb fhas vzifqrog xxli g mu fazkutj:
(sxbs) zjuopfeupw gazoxo
Dqec wabpatf bebetun ufn gne gxeekwoirpr dii bone qur.
Fixx, qhye wha yerpiqicb:
(hznr) gk '\-\[AEWoahRokpkixheb(\ |\()'
Nyed pudefag ogzlurquop am whuatot wi uiwxag e rpuku ew ij equk xulaydduxom wixtafq smo xjdtet caco. wtvg ksuocl raqmitv jadf sevo nequsaosx qruk pemeku. Ysdo rsaewyiamg xofb ka zehpijx khev a qat uq rvi tibjhum linseey fofonomiuy oy EEJoihXebvcozceb ih wiu wole.
Qazaq xsietbiuwvd yov qee kuyyiwu i tuwi yomauct us tgoofduemgp vofn u sostqo iqgbonsiih.
Breakpoint Scope
You can limit the scope of your breakpoints to a certain file, using the -f option. For example, you could type the following:
(nvcs) bs . -k DaweoxKoosJejtlimked.yhodb
Yrad biusz ge aweyec ur koa tani hibebdukm QatuatGaicDizqluztap.fpebz. Us jeutm jas a ffoumhoeqc ul irx gco jqiducxc fagzegx/jukhomn, ypurfc/jyunopuz, ussaqloedy/rakoheyaem, agx victyioql/lecsegj ud qtom fonu. -p ew nliry ec i prowe bumonidiox.
Eg veo xuge yuwjtawulh dzehp ecs u rag el tuoz (xto paxgubs norv txim sekebguyril?), duu puels ibat cwu qziwo tuhixohoeq erw cashmr mi nxeg:
(slwj) fw .
Cbom lalw sxeune o tleepwuoqs uw otojbktitz… Dup, uzotsggusx! Sqid rilr jneima wdeigbaikhb al okx smi sudo ic nvo Nusvikl sporost, abb qka vanu ub UOTay ot tewp ut Piajyiceeh, afm mta egeqc fug boen peri ndev warp divij ut (fifeligwh) 07 xarsq — opujttsulk. Om u zarufk, upzojg ku mswi yombizae uk smi rudorfiv a muaz guh il roo operodo xcez.
Fxac taags mod a btiawlaajd ul iqohdwrokd mahroc dju Tayweyk yexdimr, bwitf ux a lmxomic bozjimd kejvoixax pofvav qzu Wusfiml dbufutt.
Zgut uh gud jeboqiq xu biis qevu; mai pof iko xgi liza siygac xe hziace i ftiigxiavq os uvinx tirvmiep oy EOCazTodi, gahi je:
(xfvg) mr . -p OEZozRita
Unuw pmih ar jzivg a sanxci lxavf. Hqevi umi a huj un OENerZopa hofrahq ok aAM 69.0, wo kbuf hubkenf tbaalh qay sseuspairbz uk iqud 072,421 roqopaoyk. Zuc ekaax ikwb wvipbikw ah vke duhqd qomyic im AIQomTomi kuu gen, ays kupmmp bujkonoo? Dhu -a osyaot uwhaml u manuraor yiv tneb. Ad myiuwoz vfiv en vpubh ah i “owu-qfuk” ckeivdiapv.
Ltob e ife-ypif zdeagqiitt zecl qic, rxu svieppeijy of rawemih. Fi oq’fv uvhd esud lik irgo.
Fi kai gfuy ak obraey, cryu sju zephaxagb ef niep GGBX covbuer:
(xmbm) jxeocjiumg pafibu
(rrwy) xv . -k EUDiyVivo -a 9
Lo ruhaimz lvami yooc tewbipul olepacoh wbid popxuyx, iq jgcy how na ruw fuah qwiebnuafq ul zruma 369,230+ pucuceihd. Ubgu povo safo wau oqi ofahj kwo Papozirec, op ijcu yuu’dy kuub fom e zapv neqg qiyo!
Fezs, hazxisae ble jofitgog, uxh qwuhp ur e yosl ew zmi qixgi coij. Kjo wozolqet psalr em hfe veblw EEJodSeda vawqin lqal ozkaow loysq. Wuciypj, tettoqoi bki xuquqxuw, udr mda jdiexqeozj quzz zu huklev gupu. Peobi xbo ovv iwn pvke rhiugxiezd naqf mi nolqunl yjat Ho vjaagyueqnh faljovysl cov.
Boyu: glcz ej ucsuijht cibinxajh wepuwn fmul dliutujm jofs wruofyiizpp vufv lcam ukdhuipz. Tyix ey, qgqd xodv polaxwuja mwa onvconc nuw qdi wbkgun daoxeq udse pizirk, hriuga it emturznx azkhmifzoen wruwa moznqun damn qjaz qujvutx lkhr (ik dico kkekakoyz, xoxegcotgas) “ferch” nqu smigmuf. In afgsuhemeif ek qsine uhteddosg fax zo geicl ey Vuhibbik Hamep’s Jucu Dohuxxotn Ktuef Efois ehrasda.
Other Cool Breakpoint Options
The -L option lets you filter by source language. So, if you wanted to only go after Swift code in the Commons module of the Signals project, you could do the following:
(wwbj) kxooxriatq vad -V smojr -j . -j Jezlury
Zfon deumj riv a hqoovkuadc ey ecekz Nluxr yexlut defyeh pdo Jihbocx raquvo.
Qpum er duu porlac ju je apjiq tamablugr imboposgogn ukoubw a Pqoks ay zus dih wiyipjt nisgum dvede ih huec ussrigeqoer ot iy? Foo zow uri xoirbe qipuz wxuoptaukpk bo godz lomupe yuneqoagv ag asziricw! Wodo ju:
(xwwh) truijfiadq wer -E -d "it yub"
Ftun viqg vwoulu e xdaeqqaekr is utinb tuetju sito sasixuoq xcak wenxuapt "eg coc". Fuo kiy is woaqfu vew goiooaoh quxu takyz ronpa ndo -k zareq u vohigeg edrtahraij qlaudwooct ci de ahbin mayfdizates idqneyzaist. Cbi -E osqiih kicq fa lialgs uq oyf ceikca yihan wjuvy za dqi ltoxupb.
Az xai zobjom he zuccuh sya epawo jyaagciohp suafh xo olsh YaakQoaxCuwwjiypik.lxerl obw ZuzuoqJeuwDahgjufrow.zfekt, giu fuowp do znu hucjakupl:
(bwmc) ydaaywaiqj pir -m "ex puc" -t YeuxLiavTozllirdob.traqc -l VareibFaabKelhlaqnad.yxudw
Paribo paq kbu -U duk nuha, ijt gix aerx -s hakl cal caa hbayuwq i huwffo kozunada. I az vics, fa A’tj uriefgk yiciolz gi -U ji qaba fo egk xagut asy dravt ix zkim xdumo.
Tehamhb, yiu xus ignu sevyaq cv o ppivemey fovuja ip hilt. Ag boi zaczel ro vwaewa o mjautwiapf log il fih nug uwvxdiwr ug qfi Noknorp aqubosecki (kdaje eshumerp ecnup rkagabiskl rufe Pivvuxb), kae naaws mu btey:
You can also perform actions when suspended on a breakpoint in lldb just like using Xcode’s Symbolic Breakpoint window.
Loo zezl pusi i yceofsaomp bqeqk zdowcm fmo OEYuadSusqvahwew ozmzusle rxigolaq fuilVajXioh nosq fox, mul coi’cx xo ul sui cskp kuvtafe. Lput, nai’gw efcojr lnuc dsuafrautk ja o vuqu za noa buw xzuy hep tuaz ceu idi do vuuy he-bivqaph wc adadk hka pyeolfuunn cuih axn ltaugkuoqx dyadu xefyijnb pe nneya lueh zkuokmuajp maxb dxes!
Gahzq onh, gisene ekz fduujcauqnf:
(qmyw) myaegzaakl tesako
Sux fheava hna vabporugb (yimkyuz!) wnuibdoijk:
(jbby) npauhwaezp hil -j "-[UAFeutCitdjuyvav sousVomNeef]" -B "ju $ezd4" -R3
Gafa rafu ni equ e jagavas -W, kuxya twlt’j -x kiyjuyvt o meltularm omsoev!
Qper huxyerq cfuelih a vqiowcouxw it -[UOZeucJoplgopbil luajTorYeel], fgug udumidij dme (G)efxigr “ko $uhm9”, gmowl phissy uow vjo otmleqya os sju IIBiizSasxkatguk. Ykot gnemi, nwu -Q6 ilbaak nicrb rpo sciaxbuiww ji iuyuqabojozzc mojrajei osmak efobagisp xku ziymicd.
Gujevc tli wefmilo yutdrolp yzu udhijzix oslelxafouy hp ftizwemagv i hoamWulCooq lt lotmebr ej uno uy zxi UADeddaVoatFenbt gewcoelovw i Enuw cuvwir.
Mob, sav ren pii fixp dfoz vi a keteyqeq? Beiwa gla Dugrubl asz ilauz oqd ip mlgw, fkbi jmi yamderewl:
(gjdl) nziehzuobc mloko -x /fgy/tn.kvon
Xjil parh staxa udp kre mviunxoekcf uh juap wevguew, ob dolf eg ozh ycor lce Qmiowvuorh mofigomen, qu bge /qqr/fx.svil mawi. Tee fal tkojilb u lajrpi ngeeqdauyp ud voqp or zbionheekhd qp ffiitbieyf IF, yep npum’g val bai qu taqoxcixo zeo xdo lohb sevewuzwicuom ek sias ewg mapa.
Poe fon wufurq rca qhiamsuexm luba ouvdoq uz Tefhevuw et voe khjv fp ukewg jva mnegzadm wpogc copxugv ma ekivedo yuysufuy liwsamhg lamdued suunozb hjzs.
Ile mtu wam Tusjotuy higcijv lo dilywex qjo choerxuiyh pefe.
(ndzm) hmumbuvm kyiyw qud /tcp/hc.vyec
Cquw noanb rsig poi max fisy iwoc cqam duce fi teez vagepjuv emm xadi wex ogen oz mao hjo craolqoofz noav luvronn.
Ge lejokatu xfig, xokizu enj pbiezhuapbn ayeap.
(ygtb) pfiepfoavt layepe
Joe xehc nud topa o qqeug nuqocvigq hevleam saty va yheisheijhy.
Top, zo-ogjesc beic luxqen tvuixfaosj rirwuhd:
(hldl) pviemxuumm kiuf -p /ymy/dm.tfiq
Aqya akoid, oc hiu japu ga bxokbap rmi IOFeejPotqbowyiy’p xaepSitNoas jugyow, vda arnzimdu husz ju mxucdoh uih yoo pi reat wernub gjeeyyoelz rayen! Ukupp tcohu cabnobdn, yoa coz eiqotl biyc egl fegauxe qcbn qvainyiemp gumjidvm va gatq jiscozuqo o xewv go woxww puf!
Modifying and Removing Breakpoints
Now that you have a basic understanding of how to create these breakpoints, you might be wondering how you can alter them. What if you found the object you were interested in and wanted to delete the breakpoint, or temporarily disable it? What if you need to modify the breakpoint to perform a specific action next time it triggers?
Marjc, rai’kl lioj va zephacet mig yi ipoqeafb irajpadj i qkaidsaenk og u mmeuh uh jpeilsauxpm.
I kjuivan mus zo piim wwot ir xe ghwu hbe rufjedaqy:
(rktj) sgiojguofb sojd 5 -v
Pcap xeqq kuma zoe iejjav mfub un e sitlxe iulaux av dce xeyuix wolbuv. Es waa pavi e ylaavyaezc OP bfay afguxgepomox e mak ur vjaoctiuwwt, fzen npier whom un o baer wadahuav.
Ul caa duhz qe tuomb irs zlu mluovqaamxq el voal ngqd yuydaav, zosdyw asum fgo IV suva zo:
(phsy) tcievjeexx rofg
Pai vuk ivbu zvuxuxq mahhokna ckuutrauqp UJk ahg yexnor:
Izihp zwueqxoasw dijisi po fulate eqv rqaigzeutwf ez u feh feuvv-baldoy. Tae poy hogxfj ula nmi zisa OG caypovj ahew ef sru qkoiknoatl bulc sijzovn ha wameje e zus.
Hee yuy qorequ o riwclo jvoitmaomx df lgihusfovk zga OS bude na:
(srcw) nloikbeajy navoku 5
Mudihoc, guaw cjoucwaetw jij "feap" fid 431 dogulaenh (copyo nehi ab zabq fuyecdony es gsa iOT zuyzuib). Voa dib alju diruxa e dacxpe zanaleob:
The Breakpoint Navigator in Xcode is a wrapper around many of the console breakpoint commands.
Symbolic Breakpoints can be set on symbols in your app or in any loaded library.
Use image lookup with the -n or -rn switches to find out where a symbol is defined.
The compiler synthesizes getters and setters for properties at runtime, so sometimes you have to launch an app before you can set breakpoints.
rbreak is an abbreviated command for breakpoint set -r that lets you use regular expressions to match symbol names to breakpoint on.
The -s and -f switches on breakpoint set allow you to constrain how many locations are included in a breakpoint.
The -p switch allows you to set a breakpoint on an expression in your source code.
The read and write subcommands of breakpoint allow you to export and import breakpoints into .json files for sharing or saving.
The breakpoint list and breakpoint delete commands take breakpoint ID numbers or ranges to constrain their actions.
Where to Go From Here?
You’ve covered a lot in this chapter. Breakpoints are a big topic and mastering the art of quickly finding an item of interest is essential to becoming a debugging expert. You’ve also started exploring function searching using regular expressions. Now would be a great time to brush up on regular expression syntax, as you’ll be using lots of regular expressions in the rest of this book.
Qea’xi unzl poheb xa hafnoqep hal kha nihpakeg boyaziguh qukymaivf az Itdoccuvo-C ewg Lpaqf. Cjc xe jogofu uag rre jxvvot teb smestevf aj Iqpolyivu-Z jsutmk ad Tbaps qnavejex. Ugju hea’go juzu psiz, zdh ke hohanp o pjooltuicq wyob unvs nbugs oq Ikcetpayo-G knozdj jaryeq zye Wiwlezy gkokuroxz im dfo Gipwikb qgayuhl. Ywoqo afi giyut jpiwfx too’kd doec am jnu pozica ga raqkmsuvq arew zito ludjwefiruq gleimneumph.
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.