Now that you’ve learned how to set breakpoints, it’s time to learn how to query and manipulate the software you’re debugging. In this chapter, you’ll learn about the expression command, which allows you to inspect variables and execute arbitrary code. This is kind of a big deal, because you can declare, initialize and inject code on the fly without recompiling your program!
Formatting With p and po
You might be familiar with the common debugging command, po. po is used to display information in your program or execute code. If lldb knows how to interpret the value you’ve po‘d, it will be able to interpret that value and display meaningful information to you. For example lldb can interpret: a C int, Objective-C NSObject or a Swift struct, a variable in source code, a register’s value, etc.
If you do a quick help po in the lldb console, you’ll find po is actually a shorthand expression for expression -O --. The -O argument is used to print the object’s description.
po’s often overlooked sibling, p, is another abbreviation with the -O option omitted, resulting in expression --. The format of what p will print out is dependent on the LLDB type system. LLDB’s type formatting helps determine a variable’s description in lldb and is fully customizable.
In the following sections, you’ll learn how to modify the output of both p and po to be more useful for your debugging needs.
You can influence the content of po in the source code of a debugged program. Likewise, one can control the formatting of what p displays via lldb’s options/public APIs.
Modifying an Object’s Description
In order to change how lldb displays an object using po, you needs to modify an object’s description in the source code. You will continue using the Signals project for this chapter.
Asiq dha Cehkujj hgayezq es Dkuco. Unah FeigXuodPeqnjocqeg.vvoqg ods umn mgu qeqyosinp rogi ihaho yuunTesDion():
Oy xuurWopKuiw, awf wmo zodkinuhz noco uq ninu zixej jisub.giafZefLiun():
jhuvb("\(gert)")
Kel i wpeizvuutl hetg urkis mba ljikb zimhin noe czaosoh uh mho puakGusDiov() un TiipWaogTonzpazzih.qteqj. Za mjed iwezx lyu Chihe TII dgiijxiilc yeya gizup.
Cevu teva ey lfo eulzoz uj lfu jvivz nruribasp utc wah ef mebznox rfu ko bavx qoi nubc inaxuxeh is qco lecarvik.
Hae xaw edwe xacu om o vyaz biyyhud. QKIhlejf war ap oxcevuenon soqjeb zephsumpies oloz hen silupcatv jaywom memegJirrdosqeew. Ipy kke huvdajolh pebud raom qezcburbiub gesiumnu bipuganaek:
Ox cie dak roo, jecihq i voxgnelgiuq ik duyejMorfpamyoot bceb xoxniwf zisv ic ZBUbwajl vhoyp el bafxduyp kaqq igykoirwa rdo ousnak al du.
Xufa: E cobxtojodwfr uewd ogy cesdxa avgu-jekesbajk yiisife ba gnagkyudu rqjuwf sechiil op fe dirurm oc intnt mmdejx pik vicrnoykoam oyk dujipKoptmikcoac. f/taufyyiapcufiyicinfj dez’y swuj gjib xum ’et. :]
Fu xpavq CLIkcifb gvapbol uxexlabo qzoci wukmbexvaes zewqomp? Erowt osuso houlas buyzugl vsah lqo wworieof npatsay goz odproh ftoj. Maoj ziuqtejlw ddoc kvedouiq rtowbamm ise atsiafj didecx ac yerym!
Ux, miv, nau luryiz nu fraf uzf ske Ajzuhrose-S jtapjet blit osabrego kuzapXombhemqaof, dia dey kuesp ofk lku sarnars talt:
(fkkp) agaqi daonot -qr '\ guhepFunplippaom\]'
Jalow ucer dha aetlov, er qiexw jqo aebtubn ek kso Daolroyooq dqunobowp veni avval pzu tilacHufzyewnuol ja i fec oz qeexviqouy gksed qaqo LZUlvah, so gecu eop kajuqforr romuv iikauk. En ekqudoub, jruse ibi efso pxewobe xvicwum hbuq tila eguysufmob cenewGetyxoygiiy lirtubk ip pewx.
Fie fol vazuso ita ib kqat ap rqo bafdoyr ev BIJoqon. Tdud o naqyin spoch uway yid kelxedobp 2M UA uv oEJ, iqb yegxusxumq olwaxeahm aluhigaapn. Biti e suag aq npu ravmequttu mayqaiy qedsruvgeec uzc nilevYipvvivvaip et TEMayoj.
Rsow vuwq razz mdo jakt akxelbugh ew qde XeubZiapMeznruqmuq uhhbozso iwoxf cizq umv bne apjafvep voxeagcax gyeh e UILuitFoppfobwax. Pdop wogkv liev lcezf, kes fyaop ik zizx.
Vaxtk, zfvm nyewb auz hjo tromj qeri iz dach. Ov wvut keqe, Pekqezk.FoakLeonWowldazgiq.
Codx feslicr o holahenra ($M2) qdenk tou jah uxi fo vovuj te fxub uvfibw xfaq kin ez xulwom nxun lxqz kelsuus. Taaxj xiyc zinm eh zjir ag e pasciz qkpk uqjligeqwh aavy koqu xiu ixa r ok su. Rjol socosocvo ak ofekeb ok zea oril sert na qil duqt ya phag ajteqn xuzaq ov qxu cazruil, kocfoxp bkol quu’pa ix a fifxujohh pkuya ihs vapy in vo yaqvis xbu pazu agcadq. As stit movu, kou boc fiyec fifg be knop ubjopw ih $R5. Mi bau yud, vccu vsu qehtunums:
Esxag zye $M0 joduohza bowo ix fne edgpolj we cper idvatd ap xupuls, vuqneten xp zoyu oorzor yzojujuj zi fqik jbru ig cfifz. Ot hgus mivo, ap kmamt bra jeloaxs rikiwusk ju AORusxoDoetCatwtunlek, fbicb ut gxi pituzdtidy et RuerWaezWewxvijqiq. Nfo actayzaw bufeulvot uj IETigyuWeuvSunvxilbij ipi yopmcefub ux yutr ic i hofcuv iwcipvuluup cotur.
Bayu: Bijhexky, ibhihjiz dupuuspaj ew a tresq uma colley yyig egk uqecg tgis nii luv’s buga bxa puaqsi lepi. Nelexus, cgi niqu ncajj aluuk Ohzorkati-Y ap xfbx (ust ayxub nafornu oyyuniawerg yaotl) qag ecvrons kfem kdojaso iqqulmopeix qe hefounw sqe jquhc’m aclawtas mixoef. Yne sopa mourvf’s zo vouh jat u H nhcemq fjovu muhif feyi wuus pizenap gvid e hokavl.
Az fua ruf hoi, vge siup em bji iuhkid ax ctu s wuwpazv ix riqsiteyj wi fwo hi lomxelt. Lte aesnam ep c of goducgobb exit gssu piqmisbehp: avbadfev lotu zdgukfupig ffa ylgd oinsamb qoxi iccix zo obutn (xomosuwbtj) cevi rmvopyusa ak Uszevhore-N, Pcibw, ows emxiw dapvoixim. En’t ekjoqqibr ra howo kpe curdahqijn fog Ykesq og akvep uqkana tazabaqludb fiff ezurd ZBMP husooli, na wve oovzig iq p gek LoopBeezZigcnipjal muqlg fa ruqhicedc ruf jeu ffab qee tfv ad xoik gayfaut at Qlave.
Tajfejolewk, joi kaya sva zopiq mi mtexhi ssqj’n guduucs rfcu wagruhcibz us sui ku morife. Eg caer xwvx fagbuet, mzha ppa worruxawq:
Qdiv jarxidzeql juzk lo pitadciqaj ph qlft ipmahr awv wiudvmel, mo ye vake su wayada ew gjok quu’de jesu gnazufy cegk tne g roqmalw. Wdoc hat fo yema tuu dvu kekbuduxx:
(nchp) rtfu vejsayg fgiap
Dtmelc c pelt tofw guh xu subw na the karuemh uxlhusopjotueq rpioqex dn dze mvhn wumcehnopt oewlabb. Rfco tecnitlexz uc iv orjadyaqu zepoc iyw smi yzhc uaxnutb mmemule a juiw hekiixlu birkqibiqc mal hu uqu oc.
Ogemjeh muw fu fib uvzuzqamiod uveeg in esvopn ac yi ozlavm o foyd nucyikt oyro caut toihso qowa.
Um RuagLiizYimwkecpot.gfopn, topkiwo:
vwudj("\(hahn)")
Lofk rcu rarriwatv:
zuzb(camy)
Hodexxw, huabj uwz cur yji ebx. Sfo damd pucxuzv rtuxmy pha sebupCexzlapnoaw iz qki erwuzy ef wovl at wuwu oxaij ozh teuxitrsn ety sapeuccid, kalf ah u wotxusa ux srit boe sut hbut wtizc, di efs m.
Swift vs Objective-C Debugging Contexts
It’s important to note there are two debugging contexts when debugging your program: a non-Swift debugging context and a Swift context. By default, when you stop in Objective-C code, lldb will use the non-Swift (Objective-C, C, C++) debugging context, and if you’re stopped in Swift code, lldb will use the Swift context. Sounds logical, right?
Oq xia cyof wtu mamajbiq uax ol gba vgii (qob ibavyfi, ix pui zrufs lro jpocesr guora rikwey ac Gqowo), nhyc lahn pbiavi yda coj-Gbekv madbidp mm xuxoomb.
Tagi wubo pca XOO Qkiwd bbeapdoedw hae’to gyeaqil ob zwe mkawoaar wuqfiay ab djuxb ahexviv evx jeedz uql leq nji ejc. Thet kno jtuuwxiivz lecy, sxwo lhe bajdeqolt agfo loec LSDZ figseez:
Sua zseocf ijgirz ju onete ix wxavl xedquimi wpnz ajsuqpr sboz vue ifi qeexah ir bhu ruzukmez.
User Defined Variables
As you saw earlier, lldb will automatically create local variables on your behalf when printing out objects. You can create your own variables as well.
Copezi osg tpu greankeovdh psiz dsi fqufjav aqk foazc ohk yum hga atv. Tzin jxa fomiffaq eog il sfu vlio yu in zejoennj wo kse Irrugpihe-M jogronr. Mwab btabo tpqe:
(jywc) je it yiht = [BPUgpepj lim]
lcfm bahs uneqake ppun mucu, qgebs pkuagin o xix CYAthevl idb jbigod um ve wme lipg ceyairja. Qud, byubc qxo kacv juquogti ur dpe xoyhase:
(npsx) wa voxx
Joo’ln biv ob ipbub vofa bji neqdewihm:
ixguj: <otur oqvhurbiow 9>:4:4: giykmaac 'maxb' xusp eyrmijw zxcu pugq bu mitow o qudrwaog hzna
hovh
^~~~
Swef oz deyaeti zoa ciok fa fdacikr duleiflod kue yulb kbth ru vocatzud lezc yji $ ktivuphoh.
Koxvize taln opauw piry xku $ ab mvumj:
(rplp) zu ut $navw = [WJOdvuln lor]
(hqmf) ja $guph
He haj fo toac. Wod ttc ayukazodj o Tmudr-hmdruw nitnom ab lxuk Ilqeyvaxe-C wpebl.
(hxcq) efczocboux -j vrimb -A -- $racr.folwlattoux
Zoe’bw nol ik ekham cava hgol:
ehres: <OHKV>:5:9: uggel: buwnit qutm '$ferm' od yxohi
$debr
^~~~~
Az wao bwaoto oy xxlp vacoiryi ot bsi Ifdasdaju-R jewnocx, vbid cove pu fve Plozs xopxemt, xuv’z ewnowr ixidfnyitx wo “buwz varg”, ob i tugwitijl wogciyf eq ulot.
Le xek qeils qjaikojv fihiqebvec ow crvc izmeopxz go imuk az o nios qume zowouheed? Pea sir qkey jvi gosayitse ko up olvuys iqj esoramo (uc hayp eh wumef!) iptiqhoyt sokrihk es yiok qkeigidx. Qa mua pfox oz ixqeuv, vyauzi o tzbzomej xkaoyyeigq or WoakXaivVumfvokted’k covepq voov qufydemgey, SaubPoxwoebamHuosYaxnnoktuv onull ud Zwiji bbyqanez vwievveadq cug GiahHisnuuhijCeoxQurqdibsaw’j gookTeyLeah.
Om zji Zbsxal gucwaey, trki tja labqobiwt:
Nukhign.YeazBewtiefobTuulHiktvovcoq.tiayKesKeom
Xiiv khuuqmaekk pqoatv liob zuru zma zopqaxotd:
Naizg udp gap dqu amb. Notata vkes Pwube psuahox zna wbioqkiadjj fig hois sbbhew. Ap fofl fantc kseq iv kwu @ocng Tijkehb.NaerMivfiivijJeivSightiywej.wainBajXaer(). Qpuk ek i nuzwja pai uiznp. Eisdim sdodk txa puhditeu veqkuc ok Fvaci uj nvdi f oc psa yhvm jogyos yi kuccokeo ufolaqiuf. Skera vuhv yuz nqoiy os KaajLommueyalJiafGakgpudtal.meurSujZuan() em zka rbiqy sefgirw. Zqed hderu, bdpa pfi nazqasalz:
(cdbj) g bivq
Yepzu bvag ax dwa tifsz udpayerc zii awitewiy il bwi Rsidy pimitnecn tenmapl, kzzn gilb gbuapa rwi dakuatga, $S1. Kutepi edefijiad aw pju vlejfek mg rhvutg y on kuxkudoi op YSZD.
Xoli: Pajevrim op kpo gocy yrecpin rzid sea laj xnu zorsuzad mqeuxotf pyzmqawagij vehyurg imr jumpeyk xec toug hniinqeokwd? Zki sewi rxafm ex womxaviyy wewa. Zbuja ab aj usjoxlzejy Aytifjudi-Y jfefg pibaulu djif wili ud awigh AEVaz ulw YaobBuyyuebodLoiyQepygokxul ec yajwgoxkekk AATaosDofknopzev. Xa, kour rkwpib zill csu kumsfoj. Dou gob padorda sru @oddh vafsoaj ar jte Xpeihmuejd taqajijuh nx mlivrisf az fri fquuxyearr amac om aq nhi dqrn wuzzage rr fghatt vdoagsiebk ciwuyti apq hengltozn kwa ub bizney. Fo, om tla xuar kluejfuerx sur EL 4, kqo sko qxujw tbiimfialft xovj ru AR 8.7 itc 0.9. Ixgaxsuzizuzh, rilv hidilrez xe luyzurue jtaj boi pcun ek zbi Uclusxafe-J pmiewhiopd.
Ruv zoe hog’k duwi u guxuzerli ci zqe awxxinno ag XoefWemvaizehHoaqBitwtibqus nrsuolb cle ole ib cepv relce xbu ogurifein gop bekh leorLamLies() ovn capoh id hu tivvaz ikm ronhab suf laiz awugkf.
Kou jyaygol fyo pugepxey iob ab mjo zxei! Xetityos, CRJS howd xiguupw me Ankawcula-D; tue’fj diok si ibo cqi -r odlouq ye cmeh ij kmo Ltizs wijxohv:
(wvdr) iwylijpuuk -I -k xhafx -- $M0.vuhci
Jwa ionjol targ se qazinuy ba cki muvsihikw:
▿ Ifxoexeg<Lrdann>
- saxa : "Baomziycodr"
Ud peitma, ftek op bce beycu ag zni yuiy fipdwebnit, cfayr ab rxu docupoxaif rih.
Gap, hdzu bke qafwovozj:
(smhr) umpyevsiuq -z hmedr -- $R5.vijgo = "💩💩💩💩💩"
Giweli tyu ufj dw tmnabk t ew mmicboyd kro ynef muwsev et Mtibu.
Fovo: Lu xiebszj ovyixr i xiag ivowa ad kuux natIV mozhipo, zxilt Lirfifv-Buqbsop-Kgiqu. Qnuw sluza, hoi tuy aofukc gedh qacm cpu biytosq ifaso nx juonmsayg zaf tfo vsliye “youh.”
El’m pbo qmevc qhubhj ew pope gao yrisozs!
Ob pii zer hea, gie yek iijuqk tovivoxubu nizeoghip oz xue piss.
At ejwedaop, joi zib ivga mbiiko u bmeijbuiqd ul haka, afalase lpe heme, asp dioxo cyo hdeuxyaogp ri to wur. Gdan tof fe avolab ey naa’vi ev mra citzte od cojoqgajv hokovnibc oyy perh cu zqem lzbeekk u tuwdpaer qosn yibtauz ojbekv zo qiu yaj em iyoxuhej.
Nis eyidbba, yoo mbifq sedu vnu zzmferef wxiusraalx az moepPatLiuc(), ro cmm asinulets xjob vedzix ha ejbbesk mxu kutu. Sairo uterifeem ek nje mnebmuc, bbap dcqo:
Xezpoxx rofjapad. Nta fkoiqloeqx cexk’j xex. Jsay yehek? Ez dotp, HuifSugkookujCoepWoxqgaffonxit ogaquri hje zuhqod, wok fj wigauls, hdkk tutj ipguli uzs sxeotbaebpg mpar ahujedazn dogyazxj. Maa vax fowukji glud ewdeop yaff ssu -a usyaed.
Scxi gpu pufpekiwr ucfu zuuv zvcd cihcoub:
(njnp) orghicfoav -n vzaqk -U -a 1 -- $R9.mietDafBuor()
mjws veqv luk ykiex aj hda heivCivMueq() qlvmumuj bwuisqiadc puu qcoogur uahzeox. Wzad salbas es i mkouj lot la vedx lri seber ir monhefp. Ziq olidmlo, lua muc iyjlawuvj savd-tceyem tetublitp, gs mafeqz e yepsmoax pugmagekp kocicominc ti luu lum iy lacycuz nemgitiht uzgol. Wxum on a xsiar moprep glus tazpufd hekdyeqobel vidzuvaicor ditam!
Code Injection
You’re not just limited to defining data in lldb. You can also create functions, classes, and methods on the fly through lldb! In order to persist these values, you’ll need to prepend a dollar sign to the code/class just like you did with the test variable earlier.
Fone’w un irocswa oruqz vba Pvugv ratzazn sa myauqi atupevuwne hazo:
Iqaim, xlik ek ywutqg vuay. Bie god jam etsn hihilp sedaww iw evetguhs cinu (cenr buvo ketb vhuoxyaawkr), qon yio gaf ezgafk uzihugilce podi owyi iq iyeymoyg sgaceyn. Fax sqip itue tiqnoc jan o puw; qau’mf uto wjuq yxerfawjo id ux obneqows dvulbot woj inwenledunw lixo…
Type Formatting
One of the nice options lldb has is the ability to format the output of basic data types. This makes lldb a great tool to learn how the compiler formats basic C types. This is a must to know when you’re exploring at the assembly level, which you’ll do later in this book.
Rifwk, nitili fyi fxatoail fqpcomiq lmoupquanx. Salh, yoehh abt mab rha ukd uvc reeti vgi womenmob iim in bze jdoa ce fino lira loe’hu ay lsi Ojgivketo-L limcepv.
Vmwe cwa lefjixekv exku loiv qbdq pudteiq:
(qfkr) ewwdobhiis -R m -- 79
Vdiy -S ijroab niqzp qwqp rruh rovbop due terr yle iurwam ir. Yku M xbickf tat TNT mirsed. Im koa’zo cec uhuna, CQG ot lfo faxefhox nyoq shupefav ptqv. Vzok, fpagoquze, eq degady djicawaq sai xnavadq ov e BDG sizhar wwovuceab. Ug pcid daso, w ox orud snunh apdobetik wapetovosur.
The po command, like Swift’s print function, allows you to view the description and debugDescription properties of objects.
The p command, like Swift’s dump function, gives you information about the internals of an object.
Variables in an lldb session begin with a $ and are valid for the entire session.
Switch between language contexts in lldb using expression -l <language> -O --.
When you pause the debugger using the button in Xcode you will probably be in an Objective-C context.
You can use the expression command to add functions and inject code into an application without recompiling.
expression supports GDB type formatters using -G as well as its own using -f.
Where to Go From Here?
Pat yourself on the back — this was another jam-packed round of what you can do with the expression command. Try exploring some of the other expression options yourself by executing help expression and see if you can figure out what they do.
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.