Turbo Debugger (PC) A Turbo Debugger 3.0-4.X ‚s haszn lata p r mintap‚ld n Ugye, m r mindenkivel el“fordult az az eset, amikor els“re nem futott a programja, ak rmilyen nyelven Ąrta is. Ez nem sz‚gyen, s“t, hib ib˘l tanul az ember  az viszont, hogy az adott hib t milyen gyorsan ‚s effektĄven tal ljuk meg ‚s javĄtjuk ki, perd”nt“ jelent“s‚g–. Ebben vannak nagy segĄts‚gnkre az Łn. Debuggerek, melyek k”zl most a legnagyszer–bbel, a Turbo Debuggerrel foglalkozom. Hogy mi‚rt ‚ppen ezzel? Egyszer–, haszn lat t nagyon k”nny– megtanulni, ha az ember Borland-k”rnyezethez szokott; s az Usenet is ezt tartja a legjobb  ltal nos c‚lŁ debuggernek. Tekintsk  t, mi is t”rt‚nne, ha nem l‚tezn‚nek debuggerek, hogyan sz–rhetn‚nk ki a programhib kat! Ennek v‚giggondol sa nagyon hasznos a k‚s“bbiek szempontj b˘l, amikor t rgyalom majd a kl”nb”z“ debuggol si mesterfog sokat. Nos, ha se forr sszint–, se assembly szint– debuggernk nem lenne, akkor csak Łgy lehetne egy program 1, hib it megkeresni vagy 2, m–k”d‚s‚t megfigyelni, ha a programk˘dban mindentt (fordĄt s el“tt) olyan rutinokat helyezn‚nk el, amelyek a figyelni kĄv nt v ltoz˘k ‚rt‚k‚t k‚perny“re vagy file-ba Ąrj k. Persze lefordĄtott, hi nyz˘ forr sŁ programokat is lehetne Ągy t”bb‚-kev‚sb‚ 'hat‚konyan' nyomonk”vetni, amikor a program egy-egy j˘l megv lasztott assembly utasĄt sa helyett beszŁrunk pl. egy INT 03-at vagy INT $F0-t, s ezen interruptokra szint‚n v ltoz˘kat log-ol˘ (elment“, hogy k‚s“bb megn‚zhessk, a programfut s sor n egyes v ltoz˘k hogyan ‚s mikor v ltoztak) rutint ltet‚nk, miel“tt elindĄtan nk mag t a nyomon k”vetni kĄv nt rutint (a hi nyz˘ utasĄt st pedig az interruptkezel“ rutinban hajtatn nk v‚gre, vigy zva arra, hogy ne hajtsunk v‚gre DOS interruptot; ha mem˘riael‚r‚st Ąrtunk  t interrupthĄv sra, akkor arra is figyelemmel kell lenni, hogy a DS ‚s ES ugyan maradt a r‚gi, de a CS v ltozott. EzenkĄvl ezer apr˘ m s nansz keserĄten‚ az ‚letnket debugger n‚lkl). Midebb“l l tszik, rendkĄvl babramunka lenne az ilyen, debuggermentes 'nyomk”vet‚s', ha ‚ppens‚ggel nem lehetetlen. A Turbo Debugger gyakorlatilag a C/Pascal/Assembly-ben programoz˘k leghasznosabb seg‚deszk”ze, ha valami igaz n komoly nyomk”vet“programra van szks‚g, ami sokkal-sokkal jobb a BC-be vagy a TP-ba ‚pĄtettn‚l. Persze azok sem rosszak, de k‚pess‚geik elt”rplnek a TD lehet“s‚gei mellett. EzenkĄvl a C-vel/assemblyvel most ismerked“knek, akik a nyelv logik j t m‚g nemigen ‚rtik, egyenesen n‚lkl”zhetetlen az, hogy egyszerre k”vess‚k a forr ssz”veget ‚s a lefordĄtott k˘dot  egyid“ben, ugyanazon a k‚perny“n, s k”zben a program  ltal haszn lt v ltoz˘k ‚rt‚k‚t is lek‚rhess‚k. Ezt tudja a Borland C/Pascal debug-m˘dja is (F7/F8/F4 stb...), de ott nincs lehet“s‚g az imm r lefordĄtott disassembl lt g‚pi k˘d p rhuzamos vizsg lat ra, a v ltoz˘k file-ba logol s ra, s olyan sz‚les sk l n t”rt‚n“ t”r‚spont-felhaszn l sra, mint amit a Turbo Debugger lehet“v‚ tesz. Igaz b˘l csak egy-k‚t dolog van, ami igaz n f raszt˘ ‚s gyeng‚cske a Turbo Debuggerben. Ezeket most gyorsan felsorolom:  nincs Interceptor funkci˘ (ami pl. megtal lhat˘ az Utils.com nevezet–, orosz eredet– minidebuggerben), amely lehet“v‚ tenn‚, hogy b rmilyen interruptok (m‚g a regiszterek ‚rt‚ke is megadhat˘, mikor, milyen regisztertaralmakn l kapjuk vissza a debugger-promptot!) hĄv sakor visszakapjuk a vez‚rl‚st. Ehelyett el kell boldogulnunk a k˘dkeres‚ssel a CPU ablakban, amely pl. ”nm˘dosĄt˘, overlay-t t”lt“ vagy t”bbszegmenses proogramokn l gyakorlatilag lehetetlenn‚ teszi azt, hogy ne kelljen a programot l‚p‚senk‚nt v‚grehajtani, hanem r”gt”n megkeresve pl. az INT 10h-s a videom˘d  t llĄt s nak felt‚telezett hely‚t, od ig egy l‚p‚sben lefuttathassuk a programot. Az pedig meglehet“sen sov ny vĄgasz, hogy saj t interruptkezel“t telepĄtnk a mem˘ri ba, mely a debugger v‚grehajt s t t”r‚spontra futtatja, ha a regiszterek ‚rt‚ke egyenl“ valamivel  ez ui. l‚nyegesen t”bb g‚pel‚st ‚s kev‚sb‚ gyors debuggol st eredm‚nyez. Ez a p r emlĄtett neh‚z eset azt jelenti, ha a program bet”lt‚sekor CS:0000-t˘l kerestetnk egy int 10h-t, akkor t”bb mint val˘szĄn–, hogy azt nem leljk meg (persze lehet vari lni azzal, hogy a program kezd“, Tdump-pal lek‚rhet“ abszolŁt CS:IP-j‚b“l kisz mĄtjuk a k˘d t‚nyleges kezdet‚t, hisz az lehet, hogy cs:0000-n l l‚nyegesen kisebb cĄmeken van a mem˘ri ban. Pl. ha a TDUMP egy j˘ hosszŁ EXE-r“l azt Ąrja ki, hogy CS:IP-je 2000:0300-on van, akkor a debuggerben  lljunk a CPU ablakra, CS ‚rt‚k‚t cs”kkentsk 2000-rel (pl. 8500-r“l 6500-ra), ‚s akkor m r nagyobb az es‚lynk arra, hogy a f“program bel‚p‚si pontj t megel“z“ cĄmekre esetlegesen helyezett INT 10h-eket megtal ljuk). Persze nem kell amiatt sz‚gyenkeznnk, hogy l m, az utils.com 'alapban' tudja az interrupthĄv sok elcsĄp‚s‚t. Ugyanis m s lehet“s‚gei nincsenek. Ez azt jelenti, hogy Xmode-ot haszn l˘ programokn l sok esetben van az, hogy a 320*200*256 videom˘d be llĄt s t k”vet“en m‚g egy csom˘, nem az Xmode be llĄt s t v‚gz“ utasĄt s k”vetkezik. Ilyenkor volna j˘ egy olyan funkci˘, amely pl. OUT-ok kiad s t is figyeli ‚sat”bbi. Na persze nincs olyan nagy gond, legfeljebb t”bb id“nk megy el a t‚nyleges debuggol sra, de az igazi c0der ugyeb r mindent huszadannyi id“ alatt v‚gigdebuggol/megĄr, mint egy  tlagproogramoz˘, ‚s nekik IGAZN hasznos volna egy-k‚t ilyen extra funkci˘. Szerencs‚re nem ilyen rossz a helyzet, ui. a TD386 Hardware debugging lehet“s‚ge lehet“v‚ teszi azt, hogy I/O protok Ąr s t is elcsĄphessk.  meglehet“sen neh‚zkes (‚s lassŁ) a Search funkci˘, ak r adatk‚nt, ak r k˘dk‚nt kerestetnk vmit, ugyanis csak az adott szegmensen, azaz 64k-n bell keresi az adott adatot/utasĄt st, ‚s k‚zzel kell mindig megn”velnnk a DS (default, ha a Dump-ablakban kerestetnk), ill. a CS (CPU ablak) szegmenscĄmek ‚rt‚k‚t 1000-rel (deh t a TD-n NEM els“sorban source n‚lkli debuggol sra tal lt k ki, mint majd l tni is fogjuk).  nem figyel (egyg‚pes zemm˘dban) a nemstandard videom˘dok korrekt ment‚s‚re/ vissza llĄt s ra. Ez azt jelenti, hogy Xmode-ban Ąrt programokat  ltal ban k‚ptelens‚g a programmal debuggolni. Ilyenkor csak a k‚tg‚pes debuggol s segĄt, ugyanis ekkor a nyomonk”vetett programot t‚nylgesesen futtat˘ g‚pen sosem v ltunk videom˘dot a debugger ‚s a program k‚perny“je k”z”tt, ami bizony mindent elrontana. Ezen fell olyan 'klasszikus' esetekben is sokszor j˘ haszn t vesszk a TD-nek, amikor m r csak a lefordĄtott program van meg, forr s n‚lkl (‚s  ltal ban a szimb˘lumt bla is hi nyzik)  ez a j˘lismert 'hacker' felhaszn l s. Ha m‚gis meg akarjuk ‚rteni, ezek a programok hogy m–k”dnek, sokkal c‚lravezet“bb debuggert haszn lni, mint disassemblert (pl. Sourcer), ugyanis ez ut˘bbiak szinte k‚ptelenek hib tlan k˘dot gener lni (azaz, ha EXE-b“l ASM-ot 'fordĄtunk vissza', akkor azt TASM-rel ŁjrafordĄtva a legritk bb esetekben kapunk t‚nylegesen fut˘ k˘dot). Term‚szetesen nem egy rossz ”tlet el“sz”r a Sourcer-rel elv‚geztetni a 'piszkos munk t', ‚s a debuggert csak arra haszn lni, hogy l ssuk, hol vannak azok az utasĄt sok, amiket rosszul fordĄtott vissza a Sourcer (v‚gigdebuggoljuk a programot, miut n kiprinteltk a Sourcer  ltal kiadott v‚geredm‚ny-ASM-t vagy LST-t, ‚s a kl”nbs‚geket jegyezzk). De ne feledjk, sok esetben a Turbo Debugger ' gyŁval a ver‚bre'  hisz forr s n‚lkli EXE/COM-ok debuggol s n l azt n teljesen mindegy, hogy van-e a debuggerben kifejez‚s-ki‚rt‚kel“ egy rak s nyelvre vagy sem  ‚s ha emiatt nem f‚r be a t rba a TD mell‚ a nyomonk”vetett program, akkor azt n f“het a fejnk. Ilyenkor nincs m s lehet“s‚g, vagy a TD mem˘riatakar‚kosabb v ltozatait kell haszn lnunk (TD286/TD386/TDRemote), vagy m s, kisebb m‚ret– debuggert kell keresnnk. Miben is t”bb az ilyen, Łn. source-level debugger, mint a rendes, alp ri, csak az assembly k˘dot k”vet“ debuggerek (pl. AFD)?  el“sz”r is, a legfontosabb el“nye, hogy amennyiben a Pascal/C/Assembly forr s IS jelen van (meg a lefordĄtott EXE/(COM)), akkor egyszerre l thatjuk a forr sprogramot ‚s a lefordĄtott k˘dot. A debuggol s sor n minden olyan eszk”zzel ‚lhetnk, amit az adott nyelv lehet“v‚ tesz  gondolok itt a kifejez‚ski‚rt‚kel‚sre. Persze 500k-t˘l ne v rjuk, hogy az a programot ŁjrafordĄtsa -a Turbo Debuggerrel se nem szerkeszthetnk, se nem fordĄthatunk forr sokat-, de ne feledjk, hogy a lefordĄtott k˘d p rhuzamos debuggol si lehet“s‚ge mindez‚rt k rp˘tol! Kiemelend“, hogy amennyiben minden esetben ki akarjuk haszn lni a p rhuzamos debuggol s lehet“s‚g‚t, az Łn. szimb˘lumt bl t mindenk‚pp az EXE-hez kell linkelnnk. COM-okn l kicsit m s a helyzet, ott a TDSTRIP seg‚dprogramot kell haszn lnunk -s -c param‚terrel (ez a szimb˘lumt bl t kl”n file-ba menti, s az EXE-b“l kiv gja, ‚s Ągy lehet“v‚ teszi, hogy azt esetleg COM-m  alakĄttassuk). Ez a k”vetkez“k‚pp t”rt‚nik (csak a command line-fordĄt˘k param‚tereit emlĄtem, BC/TP kertetrendszerben is be llĄthat˘ a szimb˘lumt bla linkel‚se  Options/Compiler/Debug info, persze a Compile/Destination DISK legyen!): C programok, commandline: BCC -v Pascal programok, commandline: TPC /v EXE-k fordĄt sa .BAT-csel: tasm /zi %1 tlink /v %1 ‚s COM-ok‚: tasm /zi %1 tlink /v %1 tdstrip -s -c %1  hatalmas mem˘riafoglal s t ellensŁlyozand˘, k‚pes az EMS specifik ci˘t haszn lni, hogy nagy programokat is nyomonk”vethessnk.  meg‚rti a Pascal, C, C++ ‚s Assembly kifejez‚sszintektik t (a l‚nyeg az, hogy tetsz“leges bonyolults gŁ logikai/aritmetikai kifejez‚seket vizsg lhatunk stb..., ‚s mindezt a forr ssz”veg eredeti nyelv‚nek szintaktik j ban  nem kell teh t egy Łj nyelv kifejez‚slogik j t ahhoz megtanulnunk, ha pl. Pascal programokat akarunk ebben a rendkĄvl szĄnvonalas debuggerben nyomonk”vetni).  k‚pes visszal‚pni (meg nem t”rt‚ntnek nyilv nĄtani az utols˘ p r programl‚p‚st), k‚pes makr˘t Ąrni ‚s v‚grehajtani (ez azt jelenti, hogy azokat a billenty–lenyom sokat, amiket elk”vettnk a program haszn latakor, elt rolja ‚s szks‚g eset‚n megism‚tli  ennek nagyon fontos szerepe van akkor, ha pl. t”bb napon  t vacakolunk egy nagyobb EXE-vel)  k‚tg‚pes zemm˘dot is ismer, amikor a soros k belen, vagy ami m‚g jobb, Novell-en  t kommunik l a m sik g‚ppel (az egyiken fut a debugger, a m sikon a nyomonk”vetett program. Eszk”zmeghajt˘k nyomk”vet‚s‚n‚l elengedhetetlen, vagy akkor, amikor pl. Xmode-ot, teh t nem szabv nyos videom˘dot haszn l˘ programot debuggolunk). Sokat gondolkodtam, hogyan ‚s mit is Ąrjak a programr˘l  hogy egyr‚szt a kezd“kkel is meg‚rtessem azt a krist lytiszta logik t, amelyet a program haszn l, m sr‚szt a profiknak is rengeteg Łjat nyŁjtsak. Ez‚rt ink bb fejezetekre bontottam mondand˘mat. Az els“ fejezetben a kezd“knek Ąrok, ut na a debuggol s-csĄnja bĄnja k”vetkezik, v‚gl az antidebug k˘dok t rgyal sa ‚s a program ”sszes menj‚r“l egy ”sszefoglal˘. Magasszint– nyelvek 1: a p‚ldaprogramok ‚s helyes debuggol si m˘dszerek (kezd“knek mindenk‚pp aj nlott r‚sz!) A TD-hoz adott 'z–r”s' p‚ldaprogramokkal az‚rt ‚rdemes kl”n foglalkozni, mert a kezd“t megtanĄtj k arra, hogyan kell Łgy debuggolni, hogy min‚l gyorsabban c‚lt ‚rjnk, milyen debuggol si stĄlust kell kialakĄtani. A t rgyalt p‚ldaprogram a C nyelven Ąrt BCDEMOB. El“sz”r is, term‚szetesen, n‚zzk meg, mit is csin l helytelenl a program. Ha a k”vetkez“ k‚t sort Ąrjuk be input adatk‚nt a futtatott programnak: heh hoh hello haha hess FuX A program  ltal visszaadott erdm‚nyben bizony rengeteg hiba lesz, a sorok sz m t 2 helyett hatnak Ąrja, az ”sszes szavak sz m t kett“nek ‚rz‚keli, ebb“l m r az  tlagos sz˘sz m/sor ‚rt‚ke is meglep“en mulats gosan 1/3-ra ad˘dik, ‚s Ągy tov bb, a hib k halomz˘dnak (ez a hibahalmoz˘d s egy‚bk‚nt teljesen  ltal nos minden programoz si nyelvben - domin˘hat s). Az ember els“ feladata az, hogy eld”ntse, mik‚pp is tegyen a hib k ellen, milyen strat‚gi val t madjon a probl‚m ra. Term‚szetesen m r a legels“ hibahelyet ki kell sz–rnnk, mert m r a program v lasz b˘l kiderl, ezeket az ‚rt‚keket m s ‚rt‚kek sz mol s ra is felhaszn lja a program. A program m r l that˘an az elej‚n hib zott, amikor a szavak ‚s a sorok sz m t pr˘b lta ”sszesz molni. Ennek szellem‚ben pr˘b ljuk meg a programban tal lhat˘ fontos fggv‚nyeket, els“sorban a makeintowords-ot debuggolni, hogy l ssuk, a sorok szavait megfelel“en z rja-e le nulla byte-okkal, ‚s hogy a m sik fontosnak t–n“ fggv‚ny, az analyzewords j˘l sz molja-e a makeintowords-szal m r j˘l/rosszul  talakĄtott sorok sz m t. IndĄtsuk el a debuggert a (BC)\EXAMPLES\TD\BCDEMOB.EXE programmal. Megjelenik a program C source-a, amennyiben a default ablakokat nem helyeztk  t. Megtehetjk azt, hogy l‚p‚senk‚nt  thaladunk a makeintowords-on vagy r”gvest a v‚g‚re ugrunk, ‚s ellen“rizzk, milyen v‚geredm‚nyt adott. Mivel ez a rutin pontosan k”rlhat rolt feladatot v‚gez, sokkal egyszer–bb ‚s gyorsabb r”gvest a v‚g‚re ugrani (a 41. sorban hĄvjuk meg a fggv‚nyt, Ągy  lljunk a 42.-re  a sorsz m a Module ablak fels“ fejl‚c‚n van  ‚s nyomjunk F4-et). Megjelenik a programk‚perny“, g‚peljk be: 'heh hoh hello', ‚s nyomjunk Enter-t. Ott  llunk a makeintowords hĄv sa ut ni sorban. N‚zzk meg buffer ‚rt‚k‚t, hogy l ssuk, mi is t”rt‚nt. Menjnk fel egy sorral (a 41.-re), ‚s  lljunk r  a kurzorral a buffer sz˘ra, majd nyomjunk egy Alt-F10 I-t (Inspector). A t”mb elemei, azaz a string elemei, bet–i k”z”tt a fel-le kurzorbillenty–kkel lapozhatunk. Vegyk ‚szre, hogy a fggv‚ny, ahogy kellett, minden sz˘ v‚g‚re bef–zte a 0 byte-ot a hĄv sa el“tti $20 helyett. Ez azt jelenti, hogy j˘l m–k”dik a fggv‚ny, most a sorban k”vetkez“ fggv‚ny m–k”d‚s‚t kell megvizsg lnunk. Ehhez el“sz”r is z rjuk be az Inspector ablakot egy ESC-pel, majd k‚tszer nyomjuk meg az F7-et, hogy az analyzewords fggv‚nyt kezdjk el debuggolni. N‚zzk meg, hogy j˘ pointerrel hĄvtuk-e ezt a fggv‚nyt. Ez szint‚n az Inspector m–velettel t”rt‚nik: r  llunk a kurzorral bufp-re ‚s egy Alt-F10 I-t nyomunk. J˘l l that˘, hogy bufp egy null val lez rt 'heh' stringre mutat. ESC-pel ablakz r s. Mivel eddig minden rendben van, ez‚rt csak a t‚nyleges sz˘-lesz ml l sn l lehet gond, ez‚rt rakjunk a vesz‚lyes pontokra egy-egy t”r‚spontot. Ezek a pontok a 93., 97. ‚s 99. sorban vannak ( rdemes meggondolni, mi‚rt is - mindig egy logikailag nagyobb blokk ut n ‚rdemes beiktatni a t”r‚spontot), ezek mindegyik‚n nyomjunk egy-egy F2-t, majd F9-cel futtassuk a programot, ami rendesen meg is  ll a 93. soron. Mivel itt a legfontosabb, val˘szĄn– m r hib s ‚rt‚ket tartalmaz˘ v ltoz˘ a charcount, ‚s ezt val˘szĄn– t”bbsz”r is ki akarjuk majd ‚rt‚kelni, ez‚rt nem  rt, ha permanensen felvesszk ezt a nyomonk”vetett v ltoz˘k list j ra (Ągy nem kell  lland˘an AltF10/I-t nyomogatnunk, ha kĄv ncsiak vagyunk az ‚rt‚k‚re, hanem egy m sik, a module ablak alatt l that˘ Watch ablakban  lland˘an l thatjuk majd pillanatnyi ‚rt‚k‚t). A kurzorral l‚pjnk charcount-ra, ‚s nyomjunk egy Ctrl-F7-et. Meg is jelenik a Watch ablakban a charcount v ltoz˘ neve ‚s pillanatnyilag 0 ‚rt‚ke. Ha arr˘l akarunk meggy“z“dni, hogy a charcount++ utasĄt s j˘l sz molja-e a karaktersz mot, egyszer–en nyomjunk egy F7-et: j˘l l that˘, charcount ‚rt‚ke eggyel megn“tt, ahogy v rtuk. Futtassuk tov bb a programot egy F9-cel. —jra a 93. sorban tal ljuk magunkat, hogy egy Łjabb karaktert olvassunk be. F9-et m‚g k‚tszer nyomjuk meg ahhoz, hogy az adott sz˘ v‚g‚re ‚rjnk (a sz˘ utols˘ bet–j‚nek ‚s a z r˘null nak az olvas sa). Ekkor charcount ‚rt‚ke 3, ahogy kell lennie  sz˘val eddig minden hib tlan. F9-cel indĄthatjuk el a bufferbeli k”vetkez“ sz˘ feldolgoz s t  s ekkor vesszk ‚szre az els“ hib t. Ugyanis azt v rn nk, hogy a program Łjfent a 93. soron  ll meg, hogy belekezdjen a k”v. sz˘ feldolgoz s ba, azaz (karaktersz m nak kisz mĄt s ba), de nem  ‚ppens‚ggel az eg‚sz fggv‚ny v‚g‚n tal ljuk magunkat. Az egyetlen lehet“s‚g arra, hogy a 99. soron k”ssnk ki, az, hogy a 83. soron kezd“d“ while ciklusnak ne legyen m r true teszt‚rt‚ke  s ez azt jelenti, hogy hogy a *bufp != 0 kifejez‚snek nem szabad true (azaz nem 0) ‚rt‚ket visszaadnia. Igen  m, de most ‚pp a sz˘z r˘ null n  llunk, teh t a pointer ‚ppens‚ggel egy nulla byte-ot cĄmez! Ez azt jelenti, hogy a *bufp != 0 logikai rel ci˘ ‚rt‚ke 0, azaz FALSE. Ennek ellen“rz‚s‚hez nem kell tŁl sokat tennnk: menjnk a 83. sorban a *bufp != 0 kifejez‚s *- ra, nyomjunk egy Ins-t ‚s a kurzorral menjnk jobbra, eg‚szen a 0 al . Ennek logikai ‚rt‚k‚t pedig a Data/Evaulate Modify ablakban k‚rhetjk le (nyomjunk egy Alt-D-t, majd egy Alt-E-t, v‚gl egy Entert, ‚s az Expression ablak alatti Result ablakban pillanatokon bell felt–nik az eredm‚ny), s ez j˘l l that˘an 0, teh t FALSE. Ezek ut n a hib t m r nagyon k”nnyen kiksz”b”lhetjk. Gondoljuk meg, a bels“, a 86. soron kezd“d“ while ciklus a bufp pointert, amelyet a kls“ while ellen“riz a fent v zolt m˘don, a z r˘ 0 byte-ra cĄmezve hagyja, hiszen az els“ sz˘ feldolgoz s val is Łgy v‚gzett a rutin, hogy *bufp 0-t cĄmzett. Hogy a k”vetkez“ sz˘ra t‚rjnk, egy bufp++ utasĄtst kellene a 97. sor el‚ beiktatnunk. —jrafordĄthatn nk az eg‚sz programot azonnal, de egyszer–bb m˘dszer az, hogy kihaszn ljuk a cikkben r‚szletesen t rgyalt plusz utasĄt sv‚grehajt si lehet“s‚get be llĄtott t”r‚sponton. Ehhez el“sz”r is nyomjunk egy Ctrl-F2-t (t”ltsk Łjra a programot), t”r”ljnk minden t”r‚spontot (Alt-B D), ‚s mivel a fentiek ‚rtelm‚ben a 97. sor el‚ kell beszŁrni a pointern”vel“ bufp++ parancsot, ‚s tudjuk, hogy breakpointra ltetett parancskiad s MINDIG az adott sor v‚grehajt sa EL§TT t”rt‚nik, ez‚rt menjnk a kurzorral a 97. sorra, nyomjunk egy F2-t (Ągy a breakpoint kezd“jellemz“i always, break, 1 lenn‚nek), majd  llĄtsunk annak param‚terein: Alt-B, At, Change. Az Action soron  llĄtsunk be egy Execute-ot, az alatta lev“ Action Expression ablakba le-TABozva pedig egy bufp++-t ssnk. K‚tszer nyomjunk Enter-t, ‚s F9-cel futtassuk a programot. Term‚szetesen most m r nem kapjuk vissza a TD promptot a program fut sa k”zben, hiszen a 97. soron NEM Break-ot, hanem Execute-ot  llĄtottunk v‚grehajtand˘ cselekv‚sk‚nt. Ha lefut a program, Alt-F5-tel n‚zhetjk meg a program  ltal kiadott v‚gerem‚nyt. Most m r a t bl zatok j˘k, csak az ”ssz sor  ‚s sz˘sz m nem. Nyomjunk valamit, hogy a souce-unkat tartalmaz˘ Module ablakba visszat‚rjnk. Mivel a szavakat m r j˘l sz ml lja a program, nem  rt a printstatistics ablakban k”rln‚znnk, nincs-e ott a baj  gyernk a 104. sorra, t”ltsk Łjra a programot (ne feledjk, k”zben a 97. sorra be llĄtott t”r‚spontot nem sznteti meg a program-Łjrat”lt‚s, az ott egyszer m r be llĄtott hibakorrekci˘ addig ‚lni fog, mĄg a t”r‚sponto(ka)t nem szntetjk meg/nem hat stalanĄtjuk id“legesen) ‚s F4, ‚s Ąrjunk be valamit, pl: egyik m sik harmadik ide is Ąrj valamit +enter sorozatot. Ha a 104. sorban lek‚rjk az aktu lis argumentumok ‚rt‚k‚t, k”ztk nlines-szal, azaz az ”sszes sorok sz m val, l thatjuk, hogy nlines ‚rt‚ke 7, a helyes 2 helyett. Ez azt jelenti, hogy valahol a rutin hĄv sa el“tt ”sszekutyultunk valamit. Honnan is hĄvtuk a printstatistics elj r st? A main-b˘l. Gyernk fel, ‚s n‚zzk meg nlines ‚rt‚keit el“sz”r k”zvetlen az elj r shĄv s sor ban, majd a cs”kken“ sorsz mok fel‚ haladva visszafel‚, ha k”zvetlen a fggv‚nyt hĄv˘, azaz a 46. sorben azt rendben tal ljuk. J˘l l that˘, hogy mĄg a 36. sorban az nlines ‚rt‚ke az elv rt 2, addig a 46. sorban, amikor a fggv‚nyt hĄvjuk, az felcser‚ltetett az nwords v ltoz˘ ‚rt‚k‚vel, hisz a hĄvott fggv‚ny fejl‚ce Ągy n‚z ki: printstatistics(int nlines, int nwords, long charcount), mĄg az azt hĄv˘ utasĄt s a k”vetkez“: printstatistics(nwords, nlines, totalcharacters). No igen, a tipikus argumentum-felcser‚l‚si hiba, amikor fggv‚nyt hĄvunk. Ezek ut n m r csak a 46. sorban kell kicser‚lni a k‚t, bolddal szedett v ltoz˘t, ‚s ŁjrafordĄtani a programot. Persze ne feledkezznk meg a 96. ‚s 97. sor k”z‚ beszŁrand˘ bufp++-r“l sem! A Pascal demo debuggol s nak m˘dszerei teljesen hasonl˘ak. A rezidens programok debuggol sa A rezidens programok debuggol s nak k‚tf‚le lehet“s‚ge a kezd“k sz m ra bizony ra sok  lmatlan ‚jszak t okoz, pedig hallatlanul egyszer– dolog. Mi is t”rt‚nik akkor, ha a Turbo Debugger al˘l egy rezidens EXE/COM-ot indĄtunk? V‚grehajt˘dik a tranziens, azaz a mem˘ri b˘l t”r”lhet“ r‚sz, ami a rezidens, azaz a mem˘ri ban marad˘, a DOS  ltal v‚dettnek nyilv nĄtott terletre ir nyĄt egy-k‚t interruptvektort. Ekkor, ha a programot debuggoljuk, a tranziens r‚szt l tjuk m–k”dni, a rezidenst viszont nem, hisz az csak bizonyos felt‚telek eset‚n l‚p akci˘ba, esetleg ‚ppens‚ggel a h tt‚rben, amit a TD-b“l nem is l tunk  ekkor. Teh t rezidens programokn l, amennyiben azt m‚g nem t”lt”ttk be a mem˘ri ba, a k”vetkez“k‚pp j rjunk el:  t”ltsk be a rezidens file-ot a diszkr“l, ‚s a kurzorral keressk meg a rezidens r‚sz kezdet‚t (ha nem tudn nk, pontosan hol is van, v rjunk m‚g ezzel, mert a tranizens r‚sz a konkr‚t bel‚p‚si cĄmet  tadja majd a DOS-nak, Ągy nem kell neknk vesz“dni a konkr‚t kezd“cĄm keres‚s‚vel). Ha biztosan a rezidens r‚sz utasĄt sain  llunk a kurzorral, F2  Set Breakpoint (el‚g most az alap‚rtelmez‚s, hisz r”gt”n ‚s mindenk‚ppen vissza szeretn‚nk kapni a vez‚rl‚st, amennyiben a rezidens r‚szt v‚grehajt s t elkezdi a DOS).  a tranziens r‚szt futtassuk le (F9). Kiv‚tel: ha v‚grehajt sa sor n akarjuk megtudni, hol is van konkr‚tan a mem˘ri ban a rezidens r‚sz. Ekkor F4/l‚p‚senk‚nti v‚grehajt s.  File/Resident  kil‚pnk DOS-ba, mik”zben a TD figyeli a m r be llĄtott breakpoint-o(ka)t.  indĄtsuk el a rezdidens r‚szt (hotkey DOS alatt stb...)  ha j˘ helyre raktuk a breakpoint-ot (pl. a rezidens r‚sz legelej‚re), a TD-be automatikusan viusszal‚pnk. M ris debuggolhatjuk a rezidens r‚szt. A m sik lehet“s‚g a TDMEM haszn lat ra ‚pl, ‚s lehet“v‚ teszi a TD bet”lt‚se el“tt imm r aktiviz lt TSR-ek debuggol s t is. Teh t, g‚peljk be: TDMEM, ‚s jegyezzk meg a programunk (azonosĄt sa egyszer–, hisz a TDMEM feltnteti a rezidens program DOS filenev‚t is) szegmenscĄm‚t.  a k”vetkez“ r‚sz att˘l fgg, van-e a rezidens programunkon szimb˘lumt bla. Ennek m‚rete saccra kb. m sf‚lszerese a .TDS file-m‚retnek, s ezt a sz mot adjuk meg param‚terk‚nt a TD bet”lt‚sekor, TD -smX alakban (X=2 pl., ha 2k-ra j”tt ki a szimb˘lumt bla-m‚ret). Ha nem lesz ez elegend“, nem baj (File/Symbol load -> 'Not enough memory to load symbol table') Łjrat”ltjk a TD-t, magasabb t bla-helyfoglal ssal. Amennyiben nincs szimb˘lumt bl nk, akkor ez a l‚p‚s elmarad.  a TD-t file-n‚v megad sa n‚lkl (‚s az el“z“ pontban l tott opcion lis -smX param‚terrel) t”ltsk be  hiszen m r a mem˘ri ban van a nyomonk”vetni kĄv nt program.  a TDMEM  ltal visszaadott szegmenscĄmre(:0000) GOTO-zva a CPU ablakban, F2, s Ą.t, File/Go resident. Amikor a rezidens programot fel‚lesztjk s a TD is visszat‚r, File/Symbol load (ha van szimb. t bla), majd File/Table relocate, ui. a DOS b rhov  t”ltheti a programot, Ągy a szimb˘lumt bl nak (ami persze tartalmazza a relatĄv cĄmeket) abszolŁt kezd“cĄmet kell adnunk; itt a TDMEM-n‚l kapott ‚rrt‚ket Ąrjuk be, 10h-val megn”velve. A breakpoint-okr˘l Ez a lehet“s‚g az, amiben a Turbo Debugger vit n fell a No.1, pl ne, ha nem source/debug inf˘ n‚lkl debugolunk. Aki megtanulja rendesen haszn lni ezt a lehet“s‚get, igencsak ler”vidĄtheti a debugger alatt t”lt”tt idej‚t. El”lj r˘ban nem  rt tiszt zni h rom alapfogalmat. A szakirodalom breakpoint-on ‚rti azt a helyet, ahol a program fut s t megszakĄtva, annak adatait ki‚rt‚kelhetjk; a watchpoint egy glob lis v ltoz˘figyel‚si elj r s (s mivel nincs konkr‚t mem˘rialok ci˘hoz k”tve, ez‚rt kicsit szerencs‚tlen is a 'point' elnevez‚s), amikor minden source/asm sor v‚grehajt sa sor n ki‚rt‚kelnk megadhat˘ logikai kifejez‚seket, hogy true-v  v ltak-e m r. A tracepoint szint‚n glob lis ‚rtelm– mem˘riafigyel‚st jelent, de itt megadhat˘ mem˘riaterletek v ltoz s ra figyelnk. Nos, a TD szerencs‚re j˘val egyszer–bben b nik a k‚rd‚ssel, ui. egy-egy breakpoint-hoz olyan jellemz“ket rendel, melyekkel mindh rom fenti f“bb felhaszn l s el“Ąrhat˘v  v lik:  az a hely, ahol ez a meg ll si pont be llĄtand˘ (ha glob lis a breakpoint, akkor ez ‚rtelm‚t veszti, ui. b rhol meg ll a program, ahonnan a kijel”lt, figyelt mem˘ri t megv ltoztattuk, vagy, ha hardverdebuggot haszn ltunk, el“Ąrhat˘ I/O portokat Ąrtunk/olvastunk stb...)  az a felt‚tel, ami ezen pontot ‚lesĄti, teh t amelynek teljesl‚se est‚n t‚nylegesen meg ll a program az adott helyen (addig ui.  tsiklik rajta, hisz nincs is ott az INT 3, a TD csak akkor Ąrja be azt a k˘dterletre, ha t‚nylegesen meg kell a k”vetkez“ l‚p‚sben  llĄtani a programot). Ez lehet always, vagy ha egy kifejez‚s ‚rt‚ke igaz(z  v lik), ill. ha egy mem˘riacĄm tartalma megv ltozik.  ‚s a teend“t is megadhatjuk, mit tegynk, ha egy ‚lesĄtett breakpoint-ra ‚rkeznk. Ezen el“sz”r mindenki csod lkozhat, mire is j˘, hisz ezeket k‚zzel is megtehetjk  csakh t l‚nyegesen t”bb munk val. A default cselekv‚s term‚szetesen a breakpoint. Kevesebb emberi beavatkoz st ig‚nyel, ha NEM szakĄtjuk meg a programfut st, hanem egy kifejez‚s ‚rt‚k‚t csup n elmentjk mem˘ri ba/file-ba (log), hogy azt n k‚s“bb  tn‚zhessk. EzenkĄvl egy kifejez‚st v‚gre is hajtathatunk, ill. bizonyos csoportokba tartoz˘ breakpoint-okat aktiviz lhatunk/ passziviz lhatunk (a csoportokr˘l k‚s“bb). A Breakpoints men (Alt/B) A Breakpoints menben az F2 (Toggle) egy lok lis, always, break, Count=1 t”r‚spontot helyez el az aktu lis source/assembly sorban  teh t default hat sa ugyanaz, mint egy, az adott sorban kiadott F4-‚. Persze ha csak annyit tudna, mint az F4, akkor nem  radozn‚k ennyire a TD-r“l. A meg ll si pontok param‚tereinek f“  llĄt si pontja a Breakpoints/At..., ami a Breakpoints Options ablakot nyitja ki, melynek kezel‚s‚nek megismer‚se alapvet“ fontoss gŁ  err“l az At... almenr“l k‚s“bb. Itt van a glob lis mem˘riafigyel‚s be llĄt s t lehet“v‚ tev“ 3. ‚s 4. menpont is  mind egy mem˘riacĄm(-t”mb) tartalm nak v ltoz sa eset‚re (Changed memory global, g‚peljk be, melyik cĄmre vagyunk kĄv ncsiak, ‚s vessz“vel elv lasztva azt, h nyadik v ltoz s ut n kapjuk vissza a Turbo Debugger vez‚rl‚s‚t (ha az els“ mem˘riav ltoz skor szeretn‚nk, akkor ,1-et Ąrjunk). Egy fst alatt eg‚sz stringeket figyeltethetnk, nem kell kl”n-kl”n megcĄmezni a mem˘ri ban a byte-okat), mind kifejez‚sek teljesl‚s‚nek eset‚re (Expression True global). A Delete all is itt tal lhat˘  minden breakpoint-ot t”r”l (nemcsak maszkol!). Visszat‚rve az alapfontoss gŁ At... menpontra, abb˘l a Breakpoint options ablak nyĄlik. A cĄmmez“ kit”lt‚se pofonegyszer–, ha ‚ppen egy olyan soron  llunk, ahol m r el“zetesen nyomtunk egy F2-t, amikor annak cĄme azonnal belekerl ebbe a promptba. Amennyiben a Global lehet“-s‚get bekapcsoljuk, term‚szetesen az Address mez“ tartalma lesz, hisz minden utasĄt sv‚grehajt s ut n sor kerl a mem˘riacĄm/ kifejez‚svizsg latra. Logikusan az id“leges Disable kapcsol˘ja is idekerlt, ‚s a csoportsz mot is itt kell megadni  err“l l sd a k”v. bekezd‚st. Az ablakb˘l Change-t nyomva (Alt-h) a Conditions and actions al-ablakot var zsolja el“  ez minden debugger-felhaszn l˘ szĄve v gya! Itt  llĄthatjuk be a m r r‚szletezett felt‚teleket (Condition), hogy mikor hajt˘djon v‚gre az aktu lis breakpoint aktu lis felt‚tel‚hez rendelt cselekv‚s, azaz az Action (az‚rt van ez a k‚tszeres 'aktu lis', ui. egy breakpoint-ra t”bb felt‚telt is megadhatunk, ha a Breakpoint options ablakban Change... helyett Add...-ot nyomunk). A default term‚szetesen az Always. A Changed memory a mem˘ria v ltoz s t figyeli, ‚s a figyelt terletet defini lhatjuk a source b rmilyen 'nagyintegr lts gŁ' v ltoz˘jak‚nt is  ebben ez a szoftveres figyel‚s k‚nyelmesebb a kezd“k ‚s source-szal debuggol˘k sz m ra, mint a Hardverdebug csup n konkr‚t mem˘riacĄmeket(-tartom nyokat) figyel“ lehet“s‚ge. Az Expression true-r˘l m r esett sz˘, a Hardware pedig majd l tjuk, mire is j˘. Amennyiben felt‚teles (Expression True-t haszn lunk) a t”r‚spont, a Condition expression al-ablakban  llĄthatjuk azt be, hogy milyen logikai rel ci˘k teljesl‚se eset‚n '‚lesedjen' a t”r‚spont, teh t kapjuk vissza a TD promptot (egy p‚lda pl. C szintaktik ra: F == 3, majd l tjuk, milyen kifejez‚seket lehet m‚g felhaszn lnunk). A v‚grehajtand˘ cselekv‚st a jobbra lev“ Action ablakban  llĄthatjuk be. Mikor is  llunk meg? Ez az im‚nt t rgyalt Condition ablakban be llĄtottakt˘l fgg (mindig/adott felt‚telkifejez‚s teljesl‚se/adott mem.terlet vagy v ltoz˘ v ltoz sa/a hardveresen k‚rhet“ lehet“s‚gek (memhozz f‚r‚s, IO el‚r‚s, Fetch)). Hogy meg ll skor mit cselekedjnk, azt viszont ez az ablak, az Action hat rozza meg. Ez a cselekv‚s lehet a default Break, amikor egyszer–en visszakapjuk a TD promptj t. Itt az Execute m‚g fontosabb, ‚s nem  rt megvil gĄtani, hogyan is m–k”dik. Tudni kell, hogy tul.k‚pp az Execute az automatikus Break ‚s az azut n k‚zzel t”rt‚n“ kifejez‚sv ltoztat s/ rutinhĄv s megfelel“je, csak egy 'kicsit' gyorsabb ‚s automatiz lt. Nos, az ablak alatt lev“ Action expression ablakba beĄrt automatikus kifejez‚s‚rt‚k-v ltoztat st itt k‚rhetjk, vagy a source fggv‚nyeit meghĄvhatjuk, szabad param‚terez‚ssel, amiket az aktu lis, a breakpoint-ot tartalmaz˘ sor v‚grehajt sa el“tt futtat le a rendszer. Sajnos, assembly fggv‚nyek hĄv s val nem boldogul a rendszer, mĄg Pascal/C fggv‚nyeket remekl hĄv. Ha szeretn‚nk l tni, Pascal alatt hogy m–k”dik a dolog, pr˘b ljuk ki a k”vetkez“ programot: var hh:byte; procedure aa; begin hh:=7 end; begin hh:=0; writeln; writeln; end. FordĄtsuk le a bevezet“ben emlĄtett m˘don, TD,  lljunk a 8. sorra (els“ writeln), F2-Alt/b-A-h-Alt/X-aa()-ENTER-ENTER. Ezzel a billenty–nyom s-sorozattal az els“ writeln v‚grehajt sa el“ttre id“zĄtettk az aa elj r s egy hĄv s t (amely a hh glob lis v ltoz˘ ‚rt‚k‚t 7-re v ltoztatja). Menjnk le a 9. sorba, F2, de ne  llĄtsunk a t”r‚spont param‚terein  ekkor itt egy always, break, 1 breakpoint-unk keletkezik. Mehet az F9, visszakapjuk a TD kurzor t a 9. soron. Ellen“rizhetjk, val˘ban v‚grehajt˘dott-e az aa rutin (Ctrl/F7 a hh v ltoz˘n). Igen, megkapta a 7 ‚rt‚ket! Megj.: kicsit zavar˘ lehet, hogy Pascal-n l is alkalmazni kell a C res z r˘jeles konvenci˘j t, ha nem adunk  t param‚tereket elj r s/ fggv‚nyhĄv sn l (az el“bb is l ttuk, aa helyett aa()-t Ąrtam), de hamar megszokjuk majd. Ugyanez a teend“nk C programokn l. Assemblyben/source n‚lkl pedig a nem m–k”d“ fgvhĄv st bizony saj tkez–leg kell emul lnunk. Defini ljunk egy t”r‚spontot arra a helyre, ahol programmegszakĄt st k‚rnk (F2 -> always, break, count=1), ‚s F9 (RUN). Amikor visszakapjuk a TD promptot a t”r‚sponton, gyernk a Regs ablakba (View/Registers), Page Down, ‚s ssk be IP-be a futtatni kĄv nt rutin cĄm‚t (ha van assembly source, akkor, ha a Module ablakban lenn‚nk, a View/CPU-tal  tv ltva a konkr‚t lefordĄtott k˘dra, meg kell keresni a fizikai cĄmet). Megjegyz‚s: term‚szetesen nem musz j a programba be‚pĄtett rutint hĄvnunk, lehet a saj t magunk  ltal mem˘ri ba p”ty”g”ttet is (mak-r˘felĄr s/Block Read/Write ilyenkor nagyon hasznos, hisz Block Read-n l a r‚gebben bet”tt k˘dot visszat”lthetjk kedvenc debughelynkre. Ilyenkor persze nem  rt arra vigy zni, hogy a debugrutin COM-form tumŁ legyen, mert azt b rhova felt”lthetjk, azaz relok lhatjuk a k˘dj t), ez is tipikus p‚lda source n‚lkli programok debuggol s n l. Ilyen esetben CS:IP-nek adjunk mondjuk egy 9000:0000 ‚rt‚ket,  ltal ban ott nincs semmi  tŁl alacsony cĄm COMMAND.COM-nak ‚s a legt”bb esetben tŁl magas cĄm a debugger ut n t”lt”tt programnak; oda GOTO a disassembler ablak ban, k‚zzel, direkt beĄrjuk az utasĄt sokat 9000:0000-ra, majd azokat F7/F8-cal v‚grehajtatjuk; majd k‚zzel visszaĄrjuk a r‚gi CS:IP ‚rt‚ket. Sajnos, rendkĄvl id“ig‚nyes munka, de ez van... SzĄdj tok a Borland-ot :)! Kicsit egyszer–bb, ha pl. az F3h-as interruptot r ir nyĄtjuk 9000:0000-ra, a k˘d v‚g‚re rakunk egy IRET-et ‚s akkor m r csak egy INT 0F3h utasĄt ssal kell fellĄrnunk az ‚ppen fut˘ k˘dot (v‚grehajt s ut n PC-t kett“vel cs”kkentjk, ‚s visszaĄrjuk (assemble) az eredeti k˘dot az INT F3h hely‚re)). A Pass count-tal azt  llĄthatjuk be, h nyszor kell  tfutnia a v‚grehajt snak az adott t”r‚sponton, hogy ut na az aktiviz l˘dj‚k (default persze 1). Ne feledjk, hogy csak akkor indul a visszasz ml l s, ha a Condition expression, ha adott, igaz ‚rt‚ket ad! Ha m r a Changed mem. meg ll si felt‚tel‚nek beĄr sa kerlt sz˘ba, itt mutatom meg, hogyan lehet nemcsak egyes byte-okat, hanem pl. stringeket, t”mb”ket figyelni (ha van source). Pl. ha van egy olyan C t”mbnk, amit stingk‚nt haszn lunk, a k”vetkez“ deklar ci˘val: int str_[128]; akkor a Condition expression ablakba a k”vetkez“t Ąrva: &str_[5],15, ez a 20 ((15-5)*2) byte-nyi terlet v ltoz s t figyeli, ahol a kezd“byte a tizedik. Az be llĄtott breakpointok f“bb adatait lek‚rhetjk a View/Breakpoints ablakban; a baloldali ablakf‚lben (red“nyben) mozoghatunk a kurzorral a list n (ha source-ban jel”ltnk ki breakpoint-okat, akkor a moduln‚v.sorsz m alakj ban), a jobboldali pedig kijelzi az adott ponthoz rendelt akci˘kat/felt‚teleket stb... Az Alt-F10-zel az ablak menj‚t k‚rhetjk be, itt t”r”lhetnk pontokat/konkr‚tan az adott sort megn‚zhetjk/f–zhetnk fel Łj t”r‚spontokat (persze a szokott shortcut-ok ‚lnek az ablakon bell is, mint ahogy m r megszokhattuk a Borland-n l: Del/Enter/Ins, a fenti sorrendnek megelelel“en). Az Add-n l megjegyzend“ (ennek akkor vesszk majd haszn t, ha source jelenl‚t‚ben debuggolunk), hogy m s programmodulokba is telepĄthetnk t”r‚spontokat, nemcsak a Module ablakban szerepl“be, ilyenkor a cĄmz‚sszintaktika: #moduln‚v#sorsz m. Az Inspect (shortcut: Enter) a forr s Module, ill. a lefordĄtott k˘d (assembly) CPU ablak ban mutatja meg a konkr‚t sort, ahov  be llĄtottuk a t”r‚spontot. A Group menpont itt tal n a legfontosabb: itt szervezhetjk Łn. csoportokba az eredetileg kl”n ll˘ t”r‚spontokat. Ez azt jelenti, hogy amikor t”r‚spontot defini lunk, minden esetben kl”nb”z“ (n”vekv“ sorsz mŁ) Łn. csoportsz mot ad a TD minden egyes Łj t”r‚spontunknak. Viszont ha t”bb csom˘pontot sorolunk  t azonos t”r‚spont-csoportba, ezzel lehet“v‚ v lik, hogy ezeket egyszerre maszkoljuk stb..., s ezzel is l‚nyegesen egyszer–s”dik a munk nk. Az el“t–n“ Edit breakpoint groups ablakban egy sorban l thatjunk az azonos csoprtba tartoz˘ t”r‚spontokat, s itt is maszkolhatjuk “ket (Enable/Disable), ill. az ablak bal als˘ r‚sz‚n lev“ Add... almenben Łj group-ot hozhatunk l‚tre. A Disable kl”nb”zik a Delete-t“l: ez ut˘bbi fizikailag t”rli az azonos csoportba tartoz˘ t”r‚spontokat, mĄg a Disable csak maszkolja “ket. Ez a maszkol s azt jelenti, hogy az adott csoprtsz mŁ pontokat b rmikor egy-k‚t gombnyom sal Łjra‚leszthetjk, nem kell minden egyes t”r‚spontj t Łjra beg‚pelnnk, kifejez‚seikkel egyetemben. M‚g t rgyaland˘ a View/Log ablak. Ez az utols˘ 50 fontos esem‚nyt (hol t”rt‚ntek breakpoint-ok, pontosan mikor t”rt‚ntek fggv‚nyhĄv sok stb...) t rolja. A m‚ret a TDINST.EXE-ben v ltoztathat˘, s amennyiben nem lenne el‚g, az Alt-F10-zel az ablak saj t menj‚t el“var zsolva, amiben k‚rhetjk arra a rendszert, hogy a t”rt‚nteket Ąrja ki lemezre is (ugyanitt z rjuk le a file-t munk nk v‚gezt‚vel!). Nem  rt ”sszefoglalni, mi is id‚zheti el“ a log-ba Ąr st: b rmif‚le meg ll s t”r‚sponton nincs meg ll s, de mem˘riatartalom LOG(-file)-ba Ąr s ra van el“Ąr s. mi is b rmikor b rmilyen kommentet kiĄrathatunk a LOG-ba  pl. a megjegyz‚seinket azonnyomban kikldjk, ha valami turpiss gra r j”ttnk, az aktu lis k˘dr‚szlettel egytt, s Ągy 'egyben' lesz minden munk nk, nem kell kl”n papĄrokra Ąrk lni az eredm‚nyeinket.  nagyon kellemes szolg ltat s az Edit/Dump Pane to Log, ahol az ‚pp aktu lis ablak tartalm t kiĄrathatjuk log-ba (nagyon j˘ dolog file-ba Ąratni pl. eg‚sz k˘dr‚szleteket a CPU ablakb˘l). A hardverdebuggol s lehet“s‚gei Az egyik leghasznosabb lehet“s‚g a TD386-ban (a hatalmas DOS mem˘ria, szinte az ”sszes utasĄt sk˘d enged‚lyez‚se, c00l v‚delem a 'lerohad s' ellen stb... mellett). Term‚szetesen minimum 386sx g‚peket ig‚nyel. Hogyan is haszn ljuk? El“sz”r is, a config.sys-be Ąrjuk be ezt a sort: device=tdh386.sys, valamint minden olyan mem˘riakezel“ hĄv s t t volĄtsuk el onnan, amely a g‚pet Protected mode-ba kapcsoln  (EMM386.exe, qemm386.sys ‚s Ągy tov bb  term‚szetesen a himem.sys maradhat). Ezut n m r, ha bootolunk, m r lehet“s‚g van a TD386 haszn lat ra; indĄtsuk is el (TD386), ‚s t”ltsk be a ;v‚delem 1 komment– programot (l sd a debuggerellenes fejezetet!). Nos, mit is lehet tenni a 386 proci Łn. debugregisztereivel? L‚pjnk a Breakpoints/Hardware breakpoints menpontba. L tjuk, egy-k‚t plusz lehet“s‚gnk van a norm l, szoftveres nyomk”vet‚shez viszonyĄtva (‚s egy-k‚t negatĄvum is, mint majd l tjuk). A legnagyobb pozitĄvum az, hogy I/O portok Ąr s t/olvas s t le tudjuk flelni; megvan itt is az F2-nek megfelel“ funkci˘, azaz a Fetch instruction  ennek hat sa  amennyiben persze ebben a menben az Address oszlopban Equal-ra  llĄtott utasĄt s cĄmek‚nt megadjuk egy olyan utasĄt s cĄm‚t, ahol azt akarjuk, hogy meg lljon a program  gyakorlatilag az F2 CODE (/MODULE)-ablakbeli megnyom s val egyen‚rt‚k–. Persze az F2 is hardverdebuggol st haszn l, amikor csak lehets‚ges, teh t amikor a TDH386.SYS install lt (azt, hogy valami breakpoint/mem˘ria/IOport-figyel‚s hardverlehet“s‚geket haszn l, Łgy l that˘ legk”nnyebben, ha a View/Breakpoints ablakban csillag van a t”r‚spont neve ut n). Nos, hogy is haszn ljuk ezt a Breakpoints/Hardware breakpoints ment? A baloldali oszlopban azt adhatjuk meg, mem˘riael‚r‚sn‚l, I/O port el‚r‚sn‚l vagy utasĄt sfetch-n‚l (teh t utasĄt sv‚grehajt sn l) t”rt‚nj‚k-e a visszat‚r‚s a debuggerbe. Mind a mem˘ria, mind az IO eset‚n term‚szetesen mind olvas sr˘l, mind Ąr sr˘l lehet sz˘; s persze az Access mem/ Both I/O mindk‚t m–veletet figyeli, ha glob lisan akarunk valamit figyeltetni, fggetlenl att˘l, hogy egy adott mem˘riacĄmet (-tartom nyt) vagy I/O cĄmet ‚pp Ąrunk vagy olvasunk. A Fetch-r“l (=F2) m r el“bb sz˘ltam. Teh t, ha a p‚ldaprogramban azt szeretn‚nk el‚rni, hogy akkor kapjuk vissza a vez‚rl‚st, ha v‚grehajtunk egy OUT 21h,al utasĄt st (fggetlenl al tartalm t˘l), akkor term‚szetesen az Output I/O r di˘gombot v lasszuk (v laszthatjuk persze a Both-ot is, de akkor Ąr sn l is visszakapjuk a debuggert). Ezut n k”vetkezik a k”z‚ps“ oszlop be llĄt sa. A legfels“ lehet“s‚g minden esetben programmegszakĄt st gener l, amikor a baloldalon be llĄtott esetek vmelyike teljesl. Minden esetben, amennyiben csak a baloldali menb“l v lasztunk (+a jobboldalib˘l), a k”v. hibazenetet kapjuk: Can't set that sort of hardware breakpoint. Ez azt jelenti, hogy nem haszn lhatjuk a hardverdebuggot a k”vetkez“ esetekben:  mem˘riael‚r‚s, amikor glob lis figyel‚st k‚rnk, ak r megadott Ąrt/olvasott adattal, ak r nem. Persze ez NEM egyen‚rt‚k– a Breakpoints/Global memory change menponttal, ahol szintŁgy meg kell adnunk egy mem˘riacĄmet (egyen‚rt‚k– ebben a Breakpoints/Hardware breakpoints menben a Write Memory/Equal ponttal (az adat megadhat˘, de nem musz j), azzal a kl”nbs‚ggel, hogy ott megadhat˘ az, h nyadik el‚r‚s ut n aktiviz l˘dj‚k a breakpoint, mĄg itt az a kiĄrt/olvasott kokr‚t ‚rt‚k Ąrhat˘ el“, hogy mikor  lljunk meg).  I/O-el‚r‚s, amikor a k”z‚ps“ oszlopot szintŁgy Minden-ben hagyjuk; b r ennek lenne ‚rtelme (minden I/O-kra vonatkoz˘ el‚r‚st figyelnk), de a rendszer ezt szintŁgy nem enged‚lyezi. Ilyenkor mindegy, van-e megadott adat vagy sem.  A Fetch-csel szint‚n ugyanez a helyzet  csak adott cĄm– utasĄt s bet”lt‚se eset‚n  llhatunk meg, s azt nem tehetjk meg, hogy Minden-re  llĄtjuk a cĄmet ‚s az adatoszlopban pr˘b ljuk az utasĄt sk˘dot hex ban megadni. Sz˘val Fetch eset‚n csak az Equal haszn lhat˘ (a Range sem m–k”dik!). Nagyon fontos, hogy sajnos NEM Log-olhatjuk a hardveres breakpointokon el“Ąrt akci˘kat (ezek k”zl ui. csak aBreak ‚l), sz momra ‚rthetetlen okb˘l. Ugyan Action-k‚nt minden tov bbi n‚lkl megadhat˘ a Log, de azt a rendszer automatikusan visszaĄrja Break-re. Ez NAGYON zavar˘ ‚s rossz jellemz“. Debuggol s Novell-en vagy soros porton  t Mint m r emlĄtettem, a TD tud olyan nagyszer– kunsztokat is, mint a k‚tg‚pes debuggol s. R ad sul arra sincs sokszor szks‚g, hogy a k‚t g‚p k”z”tt soros kapcsolat legyen  ma m r, pl. egyetemeken, koll‚giumokban, v llalatokn l ‚s egy‚b k”zint‚zm‚nyekben annyira elterjedt a Novell, hogy els“sorban azt t rgyalom. El“sz”r is, k‚t g‚pr“l kell besz‚lni; egyik az, amelyen fut maga a debuggolt program, m sik pedig a TD(286/386)-ot tartalmaz˘ g‚p. rdemes elgondolkodni azon, hogy ha vmelyik g‚p gyeng‚bb, akkor azon futtassuk a debuggert, mĄg a nyomonk”vetend“ programot ‚rtelemszer–en a jobbikon. El“sz”r is, ha Novellen vagyunk, ‚s az aktĄv, Ąrjuk azt be, hogy netbios. Ezek ut n Ąrjuk be azon a g‚pen, ahol a tdremote.exe van, valamint a nyomonk”vetend“ program, hogy tdremote.exe -rn, azon a g‚pen pedig, amelyen a TD van, azon td -rn . Egy kev‚s handshake ut n a k‚t g‚p ”sszeakad, ‚s egy fantasztikus ‚lm‚nyben lesz r‚sznk! Fontos, hogy mindenf‚le Novell konfigur ci˘n fut a TD, teh t ak r k‚t szerveren, egy szerver + egy kliensen, ak r k‚t kliensen is ugyanolyan j˘l lehet debugolni. Ismert hib k: -ha a 21h-es portra Ąrunk,  ltal ban fagy a rendszer. Ahol csak lehet, pr˘b ljuk kiiktatni. Ilyenkor nagy segĄts‚gnkre lehet a TDH386.SYS-szel el‚rhet“ hardveres I/O port-figyel‚si lehet“s‚g. Ilyenkor Łjra kell install lni a TD-t a TDINST-tel, mert ha a TDINST-ben azt adtuk meg neki, hogy NOVELL-en  t k‚tg‚pes debuggol sra k‚szlj”n, akkor a Novell lekapcsol sa ut n a h l˘zat hi ny ra fog panaszkodni. -a TDH386.SYS-szel el‚rhet“ HW debug NEM m–k”dik Novellen  t. A leghelyesebb mindig el“sz”r a 'cikis' programokat (pl. az XMode-ot haszn l˘ progok) k‚tg‚pes rendszeren felt‚rk‚pezni, s amikor m r a gyors hardverdebugra van szks‚gnk, akkor vissza llni az egyg‚pes zemm˘d imm r m–k”d“ TD386- ra. Ekkor, b r a k‚perny“ megsemmisl, de legal bb a mem˘riafigyel‚s megfelel“ sebess‚ggel t”rt‚nik. -b r a Network driverek (startnet.bat) felt”lthet“k himem-be, de a Netbios nem (fagy s). -sz‚ps‚ghiba, hogy a TDREMOTE-b˘l nem l‚phetnk ki, b r a tŁloldalon ak rh nyszor megszakĄthatjuk/inicializ lhatjuk (Ctrl-F2 vagy Łj program bet”lt‚se) a rendes Turbo Debuggert. Amennyiben 'csup n' soros k belnk van a k‚t g‚p k”z”tt, akkor a k”v.k‚pp kell elj rnunk, a param‚terek a k”vetkez“ek: -rsX, ahol X=1...4 (9600...115000 bps, ahol a 115000 bps szinte minden PC-n m–k”dik, kiv‚ve a PS/2-ket, ahol csak az X=1 helyettesĄt‚st alkalmazhatjuk) -rsX, ahol X=[1,2] (COM1, ill. COM2). A TD, ill. a TDREMOTE soros kapcsolatn l t”rt‚n“ felparam‚terez‚se ennek szellem‚ben m r nagyon egyszer–. Magasszint– nyelvek 2: a leggyakoribb nyelvspecifikus hib k Sokat gondolkodtam, ezt a t‚mak”rt bevegyem-e a t rgyal somba, hiszen alapelvem az, hogy ami kih mozhat˘ a hazai piacon, magyar nyelven kaphat˘ k”nyvekb“l, annak nem adok teret cikkeimben-m‚gpedig ezek a most felsorolt hib k iskolap‚ld i az Assembly/Pascal/C programoz˘k alaphib inak. M‚gsem  rt ”sszefoglalni, hogy az egyes nyelveken programozgat˘k legf“bb,  ltal nos bakl”v‚sei, amik ‚szrev‚tel‚hez nem kellene m‚g egy TD-t sem bet”lteni, mik‚pp orvosolhat˘ak. A legt”bb pont kifejezetten trivi lisnak t–nik  ‚s m‚gis, magam is  ltal ban ezeket a hib kat k”vetem el! A C nzelvre jellemz“ alaphib k: -inicializ latlan pointerek haszn lata, pl: char *buffer AddAStringToBuffer(char *s) { strcpy(buffer,s) } itt buffer nem tudjuk, hova mutat, amĄg nem inicializ ljuk. -a heap m‚ret‚nek tŁll‚p‚se: a k”v. p‚ld ban nem szabadĄtjuk fel a lok lisan a workspace sz m ra allok lt terletet  Ągy ha a rutint sokszor egym s ut n meghĄvjuk, az 'megeszi' a heap-et (a fggv‚ny neve az‚rt ilyen m˘k s, mert b rmilyen stringm–veletn‚l, feldolgoz sn l vagy hasonl˘n l fell‚phet ilyen tĄpusŁ hiba,...). WorkOnAString(char *p) { char *workspace=(char *)malloc(strlen(p)); strcpy(workspace, p); [...] return(p); } -a nagyon j˘l ismert 'fencepost error', amikor a kerĄt‚start˘kb˘l szeretn‚nk pl. egy 10 m‚teres szakaszra 1 m‚terenk‚nt helyezni egyet-egyet, ‚s erre r v gjuk, hogy akkor bizony tĄzre lesz szks‚g. Hasonl˘ra p‚lda C-ben (amikor a hib t a '<' <=-re javĄt s val korrig lhatjuk): itt is azt hihetn“k, hogy tĄzszer hajt˘dik v‚gre a ciklus, pedig csak kilencszer: for (i=1; i<10, i++) { [...] } -nem inicializ lt bels“ v ltoz˘k: a k”v. ciklus NEM 0-t˘l, hanem egy meghat rozatlan mem˘riaszem‚t-‚rt‚kt“l indul, Ągy az sem fog ”sszej”nni, hogy a ciklusmagot t‚nylegesen hŁsszor hajtsa v‚gre: Cycle20Times() { int i; while (i<20) { [...] i++; } } -az '==' ‚s a '=' ”sszekever‚se: ez nagyon gyakori hiba kezd“‚kn‚l: if (a=b) { [...] } Ez b ‚rt‚k‚t a-ba t”lti, ‚s amennyiben ‚rt‚ke nem volt nulla, v‚grehajtja a z r˘jelek k”z”tti kifejez‚st. -nehezen fejbentarthat˘ oper torprecedencia. Ez pl.: x=3<<1+1 12 ‚s nem 7 eredm‚nyt ad (az ember ugyeb r el“sz”r a shift v‚grehajt s t t‚telezn‚ fel, ‚s nem az ”sszead s‚t). -rossz helyre rakott pontosvessz“k, felett‚bb dhĄt“ tud lenni: for (x=0,x<20,x++); { [...] }. Ilyenkor term‚szetesen a ciklusmag csak egyszer hajt˘dik v‚gre. -hib s pointeraritmetika, vigy zni kell a pointerek olyan ikrement s sa/dekrement l sa eset‚n, amikor nem byte-ok felett, hanem hosszabb adatok l‚pkednk. L sd a k”vetkez“ k˘dot: int *ptr2ints; [...] ptr2ints += sizeof(int); Itt ptr2ints megn”vel‚se nem a k”vetkez“, hanem az azut ni elemre l‚pteti ptr2ints-t, ugyanis n”vel‚sn‚l a C arra is figyel, milyen hosszŁs gŁ adatok felett l‚pdelnk. A helyes utasĄt s, hogy MINDIG a k”v. elemet ‚rjk el: ptr2ints++. -egym sba skatyuly zott bels“ v ltoz˘k. Ez a hiba f“leg akkor l‚p fel, ha pl. csak 2-3 bet–t haszn lunk (i,j,k...) ciklusszervez‚sre, ‚s valamelyik bels“ blokkban egy kls“ ciklusv ltoz˘ra pr˘b lunk Łgy hivatkozni, hogy k”zben valahol m shol m r ugyanolyan n‚vvel Łjradefini ltuk azt: valami() { int i; for (i=10;i>=0,i--) { int i=20; [...] if (i==0) { [...] } /* na ez az, ami sosem hajt˘dik v‚gre a felette lev“ sor miatt */ } } -a break hib s haszn lata: amely ugyeb r csak egy, a legbels“bb hurokb˘l ugrik ki, ‚s ha eln‚zzk a dolgot, azt hihetn‚nk, hogy t”bb“l is kil‚pett (ilyenkor a GOTO haszn lata bocs natos b–n): for (...) { while (...) { if (...) break; /*s itt mag b˘l a FOR-b˘l is ki akartunk volna l‚pni*/ } } -a bels“ v ltoz˘kra hivatkoz˘ pointerek visszaad sa azut n, miut n az azt defini l˘/haszn l˘ programr‚sz lefutott, ‚s Ągy felszabadĄtotta bels“ v ltoz˘inak hely‚t is: int *MultipleWith5(int i) { int n; n=i*5; return(&n); } Pascal: mivel a Pascalnak er“s tĄpusellen“rz‚se van, Ągy csak azok a hib k sz mottev“ek, amik a pointerkezel‚s hi nyoss gaib˘l vagy a sz nd‚kosan kiiktatott v‚delmi rutinok hi ny b˘l ad˘dnak. -neminicializ lt v ltoz˘k (C-n‚l m r l ttuk) -pointerek: -1: azel“tt haszn ln nk “ket, miel“tt vmire r ir nyĄtan nk. Ez‚rt deklar l s ut n lehet“leg miel“bb  llĄtsuk be az ‚rt‚kket egy New-val (vagy nil-ezzk ki). -2: ha egy pointer ‚rt‚ke nil, akkor az  ltala cĄmzett tartom nyt ne pr˘b ljuk el‚rni. Mindig haszn ljunk if (PtrToSomewhere <> nil) tĄpusŁ ‚rt‚kvizsg latot. -3: sohase t‚telezzk fel, hogy ha egy pointert felszabadĄtunk Dispose-zal vagy FreeMem-mel, akkor ‚rt‚k‚l automatikusan megkapja nil-t. Ezt k‚zzel kell megtennnk. -nemdefini lt fggv‚nyvisszat‚r‚si ‚rt‚k, amikor egyes IF- gakban esetleg a fggv‚nynek nem adunk visszat‚r‚si ‚rt‚ket. P‚ldak‚nt l ssuk a k”v. k˘dot: const NLMax=100; type NumList= Array[1..NLMax] of Integer; [...] function FindMax(List:NumList; Count:Integer):Integer; var I,Max: Integer; begin Max:=List[1]; for I:=2 to Count do if List[I]>Max then begin Max:=List[I]; FindMax:=Max end end; {funct FindMax} Itt j˘l l tszik, FindMax nem kap visszat‚r‚si ‚rt‚ket, amennyiben maga a lista els“ eleme volt egyben a legmagasabb ‚rt‚k is. Korrekt v ltozatban a fggv‚nyt”rzs Ągy festene: begin Max:=List[1]; for I:=2 to Count do if List[I]>Max then Max:=List[I]; FindMax:=Max end; {funct FindMax} -ugyanenn‚l a p‚ld n l, b rmelyik verzi˘t haszn ljuk is, kell m‚g p r hib t megemlĄteni: a m–k”d‚s sor n felt‚telezzk, hogy Count>=1. Nos, ha viszont Count ‚rt‚ke (az  tpasszolt lista hossza) ‚ppens‚ggel nulla, olyankor a fggv‚ny mindenk‚pp List[1] ‚rt‚k‚t adja vissza. Hasonl˘k‚pp, ha Count>NLMax, vagy Runtime Error-ban k”tnk ki (ha enged‚lyeztnk a Range Checking-et, azaz annak fut sidej– ellen“rz‚s‚t, hogy nem l‚ptk-e tŁl egy t”mb hat rait cĄmz‚sn‚l), vagy olyan mem˘riatartalmat vizsg lunk  t, amelyek m r nem tartalmaznak List-beli ‚rt‚keket. Erre az egyik megold s az, hogy sose haszn ljuk FindMax-t, ha Count ‚rt‚ke 1 ‚s NLMax k”z”tt van; a m sik az, hogy amennyiben valamelyik fenti hibalehet“s‚g fenn ll, akkor FindMax-szal pl. -32768-ot adassunk vissza: begin if (Count<1) or (Count>NLMax) then Max:=-32768 else begin Max:=List[1]; for I:=2 to Count do if List[I]>Max then Max:=List[I]; end; FindMax:=Max end; {funct FindMax} -Word/Byte tĄpusŁ ‚rt‚kek cs”kkent‚s‚n‚l, amennyiben azokat While-ciklusban haszn ljuk, elk”vethetjk a k”vetkez“ mintap‚ld ban bemutatott hib t: var w:Word; begin w:=5; while w>=0 do w:=w-1; end. Term‚szetesen egy word vagy byte ‚rt‚ke sosem cs”kenhet 0 al   itt W ‚rt‚ke 0-r˘l 65535-re ugrik, ami m‚g mindig nagyobb, mint nulla, s Ą.t., v‚gtelen ciklus alakul ki. Assembly: -elfelejtnk DOS-ba visszat‚rni (mov ah,4ch; int 21h) -CALL-lal hĄvott fggv‚ny v‚g‚r“l lefeledjk a RET-et -a RETF/RET ”sszekever‚se, kl”n”sen t”bb k˘dszegmensb“l  ll˘ (phew, ez a legrohadtabb dolog az Intel 8086 m˘dj ban) programok ‚s  ltal nosan haszn lt szubrutinok eset‚n (teh t, ha egy rutint CALL-lal hĄvunk, akkor csak RET-tel t‚rhetnk vissza, ha pedig CALLF-ral, akkor csak RETF-ral). -nem-Intel m˘don haszn lt regisztersorrend adatmozgat˘ m–veletekn‚l, l sd mov cx,dx DX-b“l a CX fel‚ mutat˘ adatmozgat st jelent (kezd“k, Motorol r˘l  tt‚rtek sz m ra nagyon komoly vesz‚ly). -tŁl kicsi vagy neml‚tez“ stack -a regiszterek ‚rt‚k‚t elront˘ szubrutinhĄv s (PUSHA/POPA segĄt, ha nem regiszterben adjuk vissza az esetleges visszat‚r‚si ‚rt‚ket. Kl”ben csak a be/kimeneti adatot nem tartalmaz˘ regisztereket mentsk). Ugyanez vonatkozik az interrupthĄv sokra. -a D flaget rosszul  llĄtjuk be stringm–veletek el“tt, Ągy a pointerregiszterek rossz ir nyba m˘dosulnak. -sose feledjk, a stringm–veletek forr scĄm‚t DS:SI, c‚lcĄm‚t ES:DI adja, ‚s eyek mov-sto-lod-n l inkrement l˘dnak vagy cs”kkennek, att˘l fgg“en, hogy a Direction flag hogy van be llĄtva. -konverzi˘ a kl”nb”z“ sz mok (byte, word) k”z”tt. Sohase essen ki a fejnkb“l, hogy az Intel fordĄtottan t rolja a sz mokat: el“sz”r a legalacsonyabb helyi‚rt‚k– byte-, ut na a magasabbik stb... Szegmens:offset cĄmekn‚l is Ągy van ez, de el“l van a szegmenscĄm. Erre f“leg akkor vigy zzunk, amikor WORD adatok byte-jait akarjuk kl”n-kl”n el‚rni. Megj.: a stringm–veletek  ltal ban gyorsabbak word”kkel, mint byte-okkal! -a flagregisztereket  llĄt˘ utasĄt sokr˘l nem  rt egy t bl zatot k‚szĄteni ‚s k‚zn‚l tartani, mert kl”nben sok-sok furcsa, b r meg‚rthet“ logik jŁ ‚lm‚nyben lesz r‚sznk... A kifejez‚sek haszn lat r˘l M r a kezd“knek Ąrt fejezetben l ttuk, logikai egyenl“(tlen)s‚gek ‚rt‚ke (T/F, azaz nem-0/0) ‚rt‚ke hogyan k‚rhet“ le (Data/Evaulate/Modify). Most azt l tjuk majd, hogyan lehet felk‚rni a Turbo Debuggert arra, hogy ezeket ki‚rt‚kelje, ‚s ‚rt‚kket sz munkra megadja, vagy breakpointokn l felhaszn lja. Meg fogjuk most azt is l tni, hogy  llĄthatjuk azt be, milyen nyelv szintaktik j t haszn lja a Turbo Debugger, ‚s ezt a default ‚rt‚ket hogyan Ąrhatjuk fell, azaz hogy Ąrhatjuk el“ kedvenc nyelvnket a C/Pascal/Assy szenth roms gb˘l. Ezut n a mindh rom nyelvben k”z”s kifejez‚s-komponenseket t rgyaljuk, ezek a source-beli sorsz mok ‚s a processzorregiszterek. Azt n t rgyaljuk azokat a komponenseket, amelyek kl”n-kl”n jellemz“ek a nyelvekre  a konstansok, v ltoz˘k, stringek, oper torok; valamint kl”n felsorolom majd a TD  ltal haszn lt oper torokat, ‚s a kifejez‚sek szintaktik j t. Mint m r t”bbsz”r is emlĄtettem, az Options/Language r di˘gombok k‚perny“j‚n azt  llĄthatjuk be, hogy a kifejez‚sszintaktik t melyik nyelvnek megfelel“en ‚rt‚keljk ki. Az alapbe llĄt s a source nyelve, ha pedig nincs source, akkor a Turbo Assemblernek megfelel“ szintaktik t v r a program  ‚s ez sokszor igen k‚nyelmetlen, ez‚rt nem  rt pl. a Pascal-t ismer“knek azt a nyelvet v lasztaniuk a fenti menben. Ugyanez vonatkozik azokra az esetekre, amikor egy olyan assembler modult debuggolunk, amit kls“, magasszint– modulokb˘l hĄvtak, ilyenkor, ha k‚zzel vissza llĄtjuk a nyelvet a kls“, f“program nyelv‚re, annak adataira ugyanolyan m˘don hivatkozhatunk, mint ahogy azt a modulon kĄvl tenn‚nk. Hasonlatosan ‚rdemes meggondolni azt a lehet“s‚get, hogy pl. stringek egy-egy byte-j t C/Assembly szintaktik val pofonegyszer–en el‚rhetjk, ha pl. Pascal forr st debuggolunk, mĄg a Pascal‚val... Adat  ‚s k˘dcĄmek, a sorok sorsz ma: ezen ut˘bbiakat meg kell hogy el“zz”n egy '#'. Az adatokat sim n a nevk beg‚pel‚s‚vel vehetjk szemgyre; persze m–k”dik a norm l segment:offset cĄmz‚s is. Ez ut˘bbiakn l nem  rt megjegyezni, hogy haszn lnunk kell a szokott megk”t‚seket: nyelv: form tum: p‚lda: C 0xnnnn 0x6789:0x0100 Pascal $nnnn $6789:$0100 Assembler nnnnh 6789h:0100h Itt is ‚rv‚nyes az a szab ly, hogy azon hexa sz mokat, amelyek A...F-fel kezd“dnek, egy null val kell el“lr“l megtoldanunk, pl. 0e789h:0cd90h. Byte-list k: N‚h ny parancs byte-list k beg‚pel‚s‚t ig‚nyli (Search, Change, Data, ill. File ablak, amikor ez ut˘bbi egy file-t hexadecim lis‚nt mutat). Term‚szetesen egy byte-lista form tuma fgg a be llĄtott nyelvt“l. NAGYON fontosak a k”vetkez“k, vigy zzunk velk: ha word/longint-k‚nt Ąrunk be sz mokat, teh t a byte-ok k”z”tt NEM alkalmazunk Space-t, akkor azt a TD automatikusan az Intel-f‚le form tumra koonvert lja. Pl. egy Pascal Longint sz m, 123456 (=$1e240) a k”v. k‚pp t roltatik el a mem˘ri ban (ill. kerestetik): 40 e2 01 00! Ez‚rt mindig haszn ljunk space-eket az egyes byte-ok k”z”tt, ha nem akarunk galib t! P‚ld k: nyelv: lek‚rt lista: amit a program keres/t rol: C "ab" 0x04 "c" 61 62 04 63 Pascal 'ab'$04'c' 61 62 04 63 Assembler 1234 "AB" 34 12 41 42 C kifejez‚sek: A TD a teljes C szintaktik t t mogatja; most minden C kifejez‚s-alkot˘elemet (szimb˘lumok, oper torok, stringek, v ltoz˘k ‚s konstansok  ebben a sorrendben) sorravesznk majd. C szimb˘lumok: el“sz”r egy kis eml‚keztet“: a szimb˘lum (symbol) egy adat vagy egy fggv‚ny neve; kezdete kis/nagybet– vagy al hŁz s lehet, a sz˘ belsej‚ben sz mok is  llhatnak. Amennyiben a TD-be al hŁz sjel n‚lkl tjk be a nevet, ‚s azt a TD nem tal ja, akkor automatikusan keresni kezd az al hŁz ssal kezd“d“ szimb˘lumook k”z”tt is (magyar n, egy al hŁz sjelet f–z az  ltalunk beĄrt szimb˘lumn‚v el‚)  ez el‚g k‚nyelmes dolog. Az Łn. regiszter-pszeudov ltoz˘k, ahogy m r a BC nyelveken megszokhattuk, a regiszterek el‚r‚s‚t segĄtik. Nagyon vigy zzunk arra, hogy ezen regiszterv ltoz˘k tĄpusa nem ‚ppen logikus, ez‚rt is Ąrtam ”ssze a k”v. t bl zatokat, el“sz”r <=286, majd a 386 regisztereir“l: V ltoz˘: RegisztertĄpus ‚s megfelel“j‚nek megnevez‚se: _AX unsigned int AX _AL unsigned char AL _AH unsigned char AH _BX unsigned int BX _BL unsigned char BL _BH unsigned char BH _CX unsigned int CX _CL unsigned char CL _CH unsigned char CH _DX unsigned int DX _DL unsigned char DL _DH unsigned char DH _CS unsigned int CS _DS unsigned char DS _SS unsigned char SS _ES unsigned char ES _SP unsigned int SP _BP unsigned char BI _DI unsigned char DI _SI unsigned char SI _IP unsigned int IP 386: _EAX unsigned long EAX _EBX unsigned long EBX _ECX unsigned long ECX _EDX unsigned long EDX _ESP unsigned long ESP _EBP unsigned long EBP _EDI unsigned long EDI _ESI unsigned long ESI _FS unsigned int FS _GS unsigned int GS A C konstans  ‚s sz mform tumait m r fut˘lagosan ‚rintettem a hexa form tum megemlĄt‚sekor. Ezen fell, 0x el“tag n‚lkl decim lis, O el“taggal okt lis a sz m br zol s. A konstanosk alapesetben 16 bitesek. Ha egy long tĄpusŁt akarunk defini lni, akkor egy l/L-et kell a sz m v‚g‚re f–zni. A float konstansok a szokott form tumŁak: 1.234 vagy 7.4e+9. Az Escape-szekvenci kat sem hi baval˘ ”sszefoglalni: \\ 0X5C Backslash \a 0X07 Bell \b 0X08 Backspace \f 0X0C Form Feed \n 0X0A Newline \r 0X0D Carriage return \t 0X09 VĄzszintes tabul l s \v 0X0B Fgg“leges TAB \xnn nn Hexa byte  megad s nak form tuma \nnn nnn s okt lis‚ Oper torprecedencia: a legmagasabb precedenci ja a dupla kett“spontnak (::) (mi ez, Tie-vad sz?  CoVboy) van, ami egy segm-offs cĄmet k‚pez az el“tte, ill. ut na  ll˘ kifejez‚sb“l; ezut n k”vetkezik a [] . -> sizeof els“dleges oper tor-sor (balr˘l jobbra), majd a * & - ! ~ ++ - sor, ut na a bin ris oper torok k”vetkeznek, fellr“l lefel‚ cs”kken“ precedenci val: * / % + - >> << <> <= >= == != & ^ | && || V‚gl a sima ‚rt‚kv ltoztat˘ utasĄt sok, melyek term‚szetesen egyenrangŁak, hisz egy kifejez‚sben csak egy szerepelhet bel“lk (visszat‚r‚si ‚rt‚kk is van persze): = += -= *= /= %= >>= <<= &= ^= |= C fggv‚nyek hĄv sa: tulajdonk‚pp megoldhat˘ lenne BC al˘l is,  lland˘an tesztadatokkal ŁjrafordĄtva, amikor a f“programban a tesztelend“ fggv‚nyeket hĄv˘ utasĄt sok szerepelnek, viszont a TD is lehet“s‚get biztosĄt arra, hogy b rmilyen param‚terrel,  lland˘ ŁjrafordĄtgat s n‚lkl (ez a legpozitĄvabb az eg‚szben, hisz egy C program lefordĄt sa tetemes id“ket is elvihet) tesztelhessnk fggv‚nyeket. P‚lda: long power(int x, int y) { long temp=1; while (y--) temp *=x; return(temp); } s p r futtat si eredm‚ny: C kifejez‚s Eredm‚ny: power(3,2)*2 18 25+power(5,8) 390650 power(2) hiba (hinyz˘ argomentum) Typecast: char float near double huge short enum int struct far long union unsigned Pascal; oper torprecedencia: (fellr“l lefel‚, mĄg az egy sorban lev“ oper torok precedenci ja azonos): * / div mod and shl shr in +  or xor < <= > >= <> Az ‚rt‚kad˘ utasĄt s (:=), csakŁgy, mint a C-ben, itt is a legalacsonyabb priorit sŁ. Assembler oper torok: xxx PTR (BYTE PTR...) . (rekordb˘l elem kiv laszt sa) : (szegmens  override) OR XOR AND NOT EO NE LT LE GT GE + - * / MOD SHR SHL OFFSET SEG ‚s a be‚pĄtett assembler  ltal meg‚rtett mneomnikok: 8086/80186/80286 utasĄt sok: AAA INC LIDT** REPNZ AAD INSB* LLDT** REPZ AAM INSW* LMSW** RET AAS INT LOCK REFT ADC INTO LODSB ROL ADD IRET LODSW ROR AND JB LOOP SAHF ARPL** JBE LOOPNZ SAR BOUND* JCXZ LOOPZ SBB CALL JE LSL** SCASB CLC JL LTR** SCASW CLD JLE MOV SGDT** CLI JMP MOVSB SHL CLTS** JNB MOVSW SHR CMC JNBE MUL SLDT** CMP JNE NEG SMSW** CMPSB JNLE NOP STC CMPSW JNO NOT STD CWD JNP OR STI DAA JO OUT STOSB DAS JP OUTSB STOSW DEC JS OUTSW* STR** DIV LAHF POP SUB ENTER* LAR** POPA* TEST ESC LDS POPF VERR** HLT LEA PUSH VERW* IDIV LEAVE* PUSHA* WAIT IMUL LES PUSHF XCHG IN LGDT** RCL XLAT XOR * 186/286 ** 286 80386/80387 utasĄt sok: BSF LSS SETG SETS BSR MOVSX SETL SHLD BT MOVZX SETLE SHRD BTC POPAD SETNB CMPSD BTR POPFD SETNE STOSD BTS PUSHAD SETNL LODSD CDO PUSHFD SETNO MOVSD CWDE SETA SETNP SCASD IRETD SETB SETNS INSD LFS SETBE SETO OUTSD LGS SETE SETP JECXZ 80486 utasĄt sok: BSWAP INVLPG CMPXCHG WBINVD INVD XADD 80386 regiszterek: EAX EDI EBX EBP ECX ESP EDX FS ESI GS Norm l CPU regiszterek: Byte fom tumŁ el‚r‚st biztosĄt˘ reg.-ek: AH, AL, BH, BL, CH, CL, DH, DL Ugyanez a szavas regiszterekre: AX, BX, CX, DX, SI, DI, SP, BP, ‚s a FLAGS flagreg. Szegmensregiszterek: CS, DS, ES, SS Lebeg“pontos regiszterek (80x87): ST, ST(0), ST(1 ), ST(2), ST(3), ST(4), ST(5), ST(6),ST(7) Sp‚ci adatel‚r‚s-prfixumok: WORD PTR TBYTE PTR BYTE PTR NEAR DWORD PTR FAR QWORD PTR SHORT 8087/80287 utasĄt sok: FABS FFREE FLDLN2 FST FADD FIADD FLDL2E FSTCW FADDP FICOM FLDL2T FSTENV FBLD FICOMP FLDPI FSTP FBSTP FIDIV FLDZ FSTSW FCHS FIDIVR FLD1 FSUB FCLEX FILD FMUL FSUBP FCOM FIMUL FMULP FSUBR FCOMP FINCSTP FNOP FSUBRP FCOMPP FINIT FPATAN FTST FDECSTP FIST FPREM FWAIT FDISI FISTP FPTAN FXAM FDIV FISUB FRNDINT FXCH FDIVP FISUBR FRSTOR FXTRACT FDIVR FLD FSAVE FYL2X FDIVRP FLDCW FSCALE FYL2XP1 FENI FLDENV FSETPM* F2XM1 FLDLG2 FSQRT *: csak 287-re ‚rv‚nyes 80387 instrukci˘k: FCOS FUCOM FSIN FUCOMP FPREM1 FUCOMPP FSINCOS A Turbo Debugger ezen kĄvl ahhoz is ‚rt, hogy az adatkijelz‚s form tum t meghat rozhassuk. —gy kell elj rnunk, hogy a v ltoz˘n‚v ut n, vessz“vel elv lasztva, be kell Ąrnunk a k”vetkez“kben felsorolt lehet“s‚gek vmelyik‚t. Fontos, hogy az ism‚tl“oper torokat csak t”mb”k ‚s pointerek eset‚ben alkalmazhatjuk. c :a nem szabv nyos (nem printelhet“) karaktereket is kirakja a k‚perny“re (a teljes IBM k‚perny“-karakter llom ny segĄts‚g‚vel) stringek/karakterek ‚rt‚k‚nek lek‚r‚sekor/nyomonk”vet‚sekor. d :egy integert decim lis sz mk‚nt  br zol f[X] :lebeg“pontos form tum, a megadott sz mŁ sz mjeggyel m :mem˘riareferencia-kifejez‚s kijelz‚se hexa byte-okk‚nt md: mint el“bb, de decim lisk‚nt p: pointer‚rt‚k. Amennyiben a szegmens‚rt‚k vmelyik szegmensregiszter ‚r‚k‚vel egyenl“, azt haszn lja a kijelz‚shez, valamint az  ltala mutatott objektum ‚r‚k‚t is visszaadja. s: stringek, ill. az azokat cĄmz“ pointerek; C eset‚n 0-val z rva. x vagy h :egy integer ‚r‚k‚t hexak‚nt Ąrja ki. A makr˘k Nagyon hasznos szolg ltat s  az  ltalunk bevitt billenty–lenyom sokat elt rolja, s egy,  ltalunk megv laszthat˘ billenty–h”z rendeli (legyen pl a '='), s ezek ut n, amennyiben azt a gombot megnyomjuk, visszaj tssza. K‚t nagyon fontos billenty–r“l kell sz˘lni: Alt =: Options/Macros/Create: Ągy kezdi felĄrni a makr˘t Alt -: Options/Macros/Stop Recording: v‚ge a makr˘Ąr snak (nagyon fontos, hogy a shortcut form t haszn ljuk, ‚s ne F10-ezznk fel a menbe  ui. a menbe viv“ gomnyom sokat is elt roln  a makr˘). Makr˘kat file-ba is kiĄrathatunk (t”bbnapos debuggol s eset‚n stb...) a Options/Save options-ben, bekapcsolt makr˘kiĄr sn l (Alt/M). Term‚szetesen nem k”telez“ a default tdconfig.td-be Ąrni, ha tŁl sok makr˘nk van, adjunk m s nevet a konfigfile-nak (ami az Options/Restore options-ben t”lthet“ be). Term‚szetesen makr˘kat t”r”lhetnk ‚s fell is Ąrhatunk  ak r file-ban, ak r mem˘ri ban. Debugger-ellenes v‚delmi trkk”k ‚s ellenszereik Egy fst alatt t rgyalom mindazon trkk”ket, amelyeket manaps g el szoktak k”vetni a debuggerek  tr z s ra. Ez tabut‚m nak sz mĄt a vil girodalomban, hisz az al bb ismertetett m˘dszerek alkalmaz s val egyr‚szt egyszer–en Ąrhatunk olyan k˘dokat, amelyek nagyon-nagyon megkeserĄtik a TD-rel dolgoz˘k munk j t; ugyanakkor MI is  t tudunk l balni az ”sszes l‚tez“ debugv‚delmen, ha egy kicsit gyakoroljuk az INT3-as v‚delmek kij tsz s t  ezek ut n m r nem lesz program, amin ne tudjatok  tmenni. Ha megtanulj tok m‚g a kl”nb”z“ t”m”rĄt‚si ‚s adattitkosĄt si algoritmusokat, ‚s akkor m r pl. a SCANNER textjeit Ąs  tĄrhatj tok, nemcsak kiszedhetitek! Ez egy msg a magyar scene azon tagjainak, akik arra v gtak fel, hogy “k bizony kiszedt‚k a SCANNER textjeit: ha majd a fent emlĄtettek megtanul s val k‚pesek lesztek a sz”vegeket  t is Ąrni, Łgy, hogy els“ l t sra pl. a SCANNER5.EXE m‚retre origin lnak (semmi kls“ file vagy EXE-m‚retn”veked‚s, ami azt jelenten‚, hogy az adott,  tĄrt, partikul ris cikk eset‚ben  tĄrt tok a fut˘ k˘dot, ‚s azt kl”n, saj t elj r ssal olvass tok be stb... EGY BITET NEM VLTOZTATHATTOK A FUT• K•DON!) t–nj‚k, majd akkor legyetek nagyfiŁk! :-) Term‚szetesen sok, a Turbo Debuggerre jellemz“ dolog nem  ll a t”bbi, piacon kaphat˘ debuggerre, Ągy a Soft-iCE-ra, ez‚rt a kiv‚teleket mindentt megemlĄtem. A teljess‚gre t”rekedtem, Łgy, hogy lehet“leg mindig m–k”d“ ‚s fordĄthat˘ p‚ld kat mutassak. Sohase feledj‚tek, hogy amennyiben debugv‚delmet Ąrtok, igyekezz‚tek a code-ot az '‚rz‚keny' r‚szeken agyonbonyolĄtani, teh t egy csom˘ utasĄt st, ‚rt‚kad st bet”mni a 'cikis' r‚szekre, a lent t rgyalt m˘dszerekkel, figyelemelterel‚s gyan nt! EzenkĄvl, amit nagyon aj nlok mindenkinek, aki gyakorolni akarja most megszerzett ismereteit: HyperLOCK 386 (pl. a GUS Roland-emul tor n, a MEGA-EM-en ez a debugellenes c0de van). Egyik legismertebb fog s a debuggerek ellen a keyboard interruptok lel”v‚se, ill. nem tov bbad sa a BIOS-nak. Hardveresen ezt a k”vetkez“ m˘don ejthetjk meg: a 8259 Interrupt Controller chipet programozzuk fel meglep“en cselesen. Tudni kell, hogy a 8259 felel“s az IRQ voanalak‚rt  s Ągy az IRQ-kat hat stalanĄthatjuk 0 ‚s 7 k”z”tt (term‚szetesen a 0. bit az IRQ0-t maszkolja, az 1. az IRQ1-et s Ą.t.). Na igen, de ez mire j˘? Az IRQ 1 ugyeb r a bilenty–zetinterrupt  megvan a megold s. Mit is jelent ez? Ha l‚p‚senk‚nt (F7) debuggoljuk a programot, akkor semmit, a TD 'tesz r˘la', hogy a billenty–zet mindig ‚ljen. Viszont ha az al bbi h rom utasĄt s ak r egyszer is lefut, ut na m r az ‚letben nem tudj tok Łjra el“hĄvni a TD-t addig, amĄg Łjra nem enged‚lyezitek az IRQ1-et (AND AL, 0fdh az OR helyett). Persze addig a billenty–zet sem m–k”dik, de ha ‚ppen file-m–veleteket v‚geztek, amikor nincs szks‚g a fut˘ programnak a billenty–zetr“l beadott inputra, akkor nincs gond. Hasonl˘ ‚rhet“ el akkor, amikor teljesen saj t billenty–zetkezel“t Ąrunk, amikor a BIOS-nak semmilyen esetben nem kldjk tov bb a vett bill. k˘dot (pl. korai SCANNER-ek). Figyelem! Ez a trkk nagyon egyszer–en kiv‚dhet“ 1, l‚p‚senk‚nti debuggol ssal; 2, t”r‚spontok alkalmaz sval, amikor tudjuk, hogy a program egy szakasza letiltott billenty–zet–, ‚s ez‚rt oda F2-vel t”r‚spontokat helyeznk, amelyek akkor is visszaadj k a vez‚rl‚st, ha t”rt‚netesen t‚nyleg le van tiltva a billenty–zet, mik”zben az adott programr‚sz hajt˘dik v‚gre: IN AL,21h OR AL,02 ;1. bitet 1-be  llĄtjuk OUT 21h,AL Kiv‚telek: ez a Soft-ICE debugger ellen nem haszn lhat˘, amely akkor is k‚pes 'bet”rni' egy fut˘ programba, ha a fenti m˘dokon letiltottuk a billenty–zetet. Ha valaki nem hiszi, j rjon ut na: ;v‚delem 1 .model small .code IN AL,21h OR AL,02h OUT 21h,AL ; el“sz”r ide rakj tok a kk: [...] jmp kk r‚szt, F9-cel futtass tok a k˘dot, ‚s pr˘b ljatok Ctrl-Break-ot nyomni! IN AL,21h AND AL,0FDh ;keyb. visszakapcsol sa OUT 21h,AL KK: NOP JMP KK END M sik m˘d a processzorfetch felhaszn l sa. Tudni kell, hogy m‚g a legrosszabb 8088-as is 4 byte-ot el“re olvas a k˘dmem˘ri b˘l  ‚s ‚ppen ezen van a hangsŁly! Ui. ha ez a k˘dmem˘ria akkor v ltozik meg, amikor m r az ottani utasĄt s benn v r a processzor min. n‚gybyte-os el“re olvas˘ sor ban, akkor a proc m‚g a r‚gi utasĄt st hajtja v‚gre! VISZONT, ha egy debuggerrel l‚p‚senk‚nt vagy glob lis mem˘riaellen“rz‚st/kifejez‚ski‚rt‚kel‚st k‚rve hajtjuk v‚gre a k˘dot, akkor az egyes utasĄt sok beolvas sa k”z”tt rengeteg m s utasĄt st hajtunk v‚gre, Ągy a debugger az imm r m˘dosĄtott k˘dot olvassa be. P‚lda: .model small .code xor ah,ah mov byte ptr cs:[hh+1],ah hh: mov ax,5 cmp ax,5 jne DeBuG DeBuG: mov ah,4ch ;ett“l a cĄmk‚t“l helyezzk el a tr‚f lkoz˘ zeneteket stb...  ekkor derlt ki, debuggolj k a programot. int 21h end Mi is t”rt‚nik itt? A mov byte ptr cs:[hh+1],ah utasĄt s a r”gt”n ut na k”vetkez“ hh: mov ax,5 argomentum t null zza ki. Amennyiben nem debuggoljuk a programot, ezt a v ltoz st m r nem veszi ‚szre a processzor, ‚s az a r‚gi k˘dot hajtja v‚gre, amikor is az eredeti ‚rt‚ket t”ltjk az AX-be, ‚s Ągy a cmp ax,5 eredm‚nye is Z=1 lesz. A most k”vetkez“ m˘dszerek majd' mindegyike az INT 3 ‚s az egy‚b, hasonlatos szerep– interruptvektorok vari l s n alapul. Ezekkel a m˘dszerekkel nagyon k”nny– 'bel˘gatni' a Turbo Debugger-t, viszont az ilyen szempontb˘l jobb debuggerek nem v‚reznek el az ilyen akad lyon  l sd: a Soft-ICE-ban lekapcsolhat˘ az INT 3 'saj t' c‚lokra t”rt‚n“ felhaszn l sa. Tudom, ez Ągy els“re el‚g nehezen volt sokatok sz m ra em‚szthet“, ez‚rt pr˘b lj tok ki a k”v. programot: .model small .data OldInt3 dd 0 ;erre a ment‚sre a rutinban nem LENNE tul.k‚pp szks‚g  de kil‚p‚s el“tt az‚rt  llĄts tok vissza az INT 3 r‚gi ‚rt‚k‚t! .code ; a v‚delem felĄr s nak kezdete. A ;! komment– sorok elhagyhat˘k. CLI XOR AX,AX MOV ES,AX ;0000-t cĄmznk  k”zvetlen INT-el‚r‚s MOV BX,ES:[000Ch] ;! MOV word ptr [oldint3],BX ;! MOV BX,ES:[000Eh] ;! MOV word ptr [oldint3+2],BX ;! MOV Word Ptr ES:[000Ch],offset newrutin MOV Word Ptr ES:[000Eh],seg newrutin STI ; a v‚delem v‚ge int 3 mov ah,2 int 21h mov ah,4ch int 21h newrutin: mov dl,0a0h iret end Nos, el“sz”r is arr˘l, mit csin l a prog. A cli/sti utasĄt sok k”z”tt el“sz”r is elmenti INT 3 r‚gi ‚rt‚k‚t ‚s direkt m˘don azt fellĄrja egy, a newrutin-ra mutat˘ pointerrel. Mi‚rt direkt m˘don? Mert  ltal ban a debuggerek r telepszenek a DOS/25-re ‚s ez nem dv”zĄt“ olyankor, ha r”gt”n l tja a debugger, hogy bizony valaki interruptvektorokat Ąr. Mit csin l ez a newrutin? Egyszer–en az ' ' k˘dj t visszaadja dl-ben, hogy azt a program, a 3-as interruptt˘l visszakapv n a vez‚rl‚st, a k‚perny“re var zsolja (DOS, 2 alfunkci˘). El“sz”r is, futtass tok le DOS alatt a progot! Ugye, semmi baj nem t”rt‚nik, megjelenik az  , ahogy v rtuk. No, t”lts‚tek be a TD-t, ‚s F9. Most sem t”rt‚nik kl”n”sebb baj, a program rendesen lefut ‚s kil‚p. Pr˘b lkozzatok most egy F4-gyel (a k˘don bell b rhol kiadva, persze miut n felt”lt”ttk a 3-as interruptvektort), vagy ak r l‚p‚senk‚nti futtat ssal. Nos, elsz ll a program, Ctrl-Break tal n segĄt. K”vetkezz‚k a TD386 alatti pr˘ba. Ez m r egy fokkal jobb  ez legal bb nem 'sz ll el', viszont ak r egyszer– futtat st v lasztunk, ak r l‚p‚senk‚nt/breakpoint-tal k”vetnk nyomon, visszakapjuk az int 3 utasĄt s v‚grehajtsa el“tt a TD promptot, ‚s ha az INT 3-at v‚gre is hajtatjuk, j˘l l tszik, az a k˘d nem futott le, aminek pedig kellett volna. Mi mindennek a magyar zata? Tudnotok kell, hogy amikor kiadj tok az F4 parancsot, akkor a v‚grehajtand˘ k˘dba a kurzor sor n a TD becsemp‚sz egy CCh utasĄt sk˘dot, ‚s term‚szetesen mag ra ir nyĄtja a 03-as interruptot. A 03-as interruptot a TD Ągy mindig haszn lja  ‚s ez az alapja a legt”bb debugellenes rutinnak. Mindezek f‚ny‚ben, a Turbo Debugger-rel pr˘b lkoz˘kat nagyon k”nnyen lefegyverezhetitek, ha a 03-as interruptot pl. el‚g komoly cĄmsz mĄt˘ rutinokra, CRC-k‚pz“ ‚s egy‚b 'kutyul˘' rutinokra ir nyĄtj tok. Az ilyen 'antilamer' k˘dok ellen k‚t lehet“s‚g van: els“ a Soft-ICE haszn lata; m sik a k˘dbeli INT 3-ak  tĄr sa pl. INT 0FAh-ra, arra is figyelve, hogy amikor a program a 03-as interrupt ‚rt‚k‚t  tĄrja, akkor m r ELEVE ott is a 0fah-s interruptvektort Ąrassuk  t. Ilyenkor kett“ komoly bajt az elt‚r“ utasĄt shossz, illetve a k˘dr˘l CRC-”sszeget k‚pz“ rutinok (pl. HyperLOCK 386) okoznak. Mir“l is besz‚lek, ha az elt‚r“ utasĄt shossz probl‚m j t emlĄtem? Tudj tok m r nagyon j˘l, hogy az INT 3, valamint az INTO utasĄt sk˘dja egyb jtos, mĄg az ”sszes t”bbi‚ k‚tbyte-os. Teh t, ha debugger alatt debuggolunk, akkor amikor egy int 3 utasĄt sra ‚rnk, s azt  tĄrjuk int 0fah-ra, akkor, amikor az interrupt rutin egy IRET-tel visszat‚r, teljesen term‚szetes, hogy az IP kett“vel ugrik (egy igazi INT 3 v‚grehajt sa ut n csak eggyel n”vekedne), valamint a k”vetkez“ utasĄt s els“ byte-ja is bajba kerl. Mit lehet tenni? Term‚szetesen PC-t cs”kkentjk a Registers ablakban, visszaĄrjuk int 3-at a r‚gi hely‚re, s k”zvetlenl ut na az eredeti, azt k”vet“ utasĄt st, amelyet az int 0f0h elrontott. A Divide by Zero vektorr˘l tudni kell, hogy a TD386 hib val le ll, mĄg a TD sim n lefuttatja, teh t nem ir nyĄtja mag ra. EmĄgy a TD386-tal debuggol˘k sz m ra szerez egy kis meglepet‚st a k”v. code: .model small .code XOR AX,AX MOV DS,AX ;ds:=0 CLI MOV ds:WORD PTR [0000],offset hah MOV ds:[0002],CS STI MOV AH,00 DIV AH HAH: MOV AX,4C00h INT 21h end Term‚szetesen az ilyen primitĄv trkk”k is egy f‚l pillanat alatt lel“het“ek, hisz a TD386 van annyira ‚rtelmes, hogy visszaadja a promptot a DIV AH utasĄt son. Azt pedig k‚t NOP-ra cser‚ljk, vagy  tir nyĄtjuk egy m sik interruptra, ahogy m r l ttuk ‚s l tni is fogjuk. Szerencs‚re itt nincs gond az utasĄt shosszal, mint az egybyte-os INT 3  tir nyĄt sakor, hisz a DIV AH k‚tbyte-os. KonklŁzi˘: a TD386 ‚rz‚keny az INT 0-ra, az INT 3-ra, valamint az INTO-ra  az ilyen debugellenes k˘dokat haszn l˘ programokn l nincs m s lehet“s‚g, mint a nagyon odafigyel“ k‚zi debug vagy a Soft-ICE. Hasonl˘an,  tverhetjk a felhaszn l˘t is. Nagyon primitĄv ‚s egyszer– dologr˘l van sz˘, az ember azonnal l tja (csak a kezd“k nem :)), hogy az aktu lis debuggolt 'utasĄt s' el“l elt–nt a fekete h romsz”g, ill. hogy olyan 'furcsa' esem‚nyek t”rt‚nnek, mint pl. 'ugyanazon a cĄmen' k‚tszer is meg kell nyomni az F7-et, mĄg tov bbugrunk stb... P‚ld ul a k”vetkez“ m˘don 'rejthetnk el' egy-k‚t utasĄt st: .model small .data org 0cdcch ;nem kell ezzel vigy zzunk (nehogy pont a code k”zep‚be traf ljon bele az 'Ąr s' stb...), hiszen SEMMIFLE Ąr sm–veletre nem kerl sor, mint majd l tjuk. hhh db 0 .code mov ah,4ch mov bx,offset hah add bx,2 jmp bx hah: mov byte Ptr [hhh],21h end FordĄts tok le, debuggolj tok, ‚s megl tj tok, milyen pof san sikerlt elrejteni az INT 3 ‚s az INT 21h utasĄt sokat! Ha els“re nem l tn tok “ket, akkor a Code ablakban nyomjatok egy Ctrl-G-t ‚s Ąrjatok be egy 000ch-t! Hasonl˘an m–k”dnek a hasonlatos viccek; a DATA szegmens org fordĄt si direktĄv j nak kell csak m s-m s param‚tert adni, att˘l fgg“en, hogy ‚ppen milyen utasĄt st akarunk 'elrejteni' a kĄv ncsi szemek el“l. Arra persze nem  rt vigy zni, hogy a hhh byte k”zvetlenl az org ut n legyen, ne legyenek k”zben m s adatok (s“t, ut na sem, a fent emlĄtett beletraf l s-lehet“s‚g miatt). De NE feledj‚tek: ez a trkk csak a kezd“ket t‚veszti meg! Egy olyan vicc k”vetkezik, ami a real-m˘dbeli debuggerekkel dolgoz˘ emberk‚ket szivatja (a TD386 alatt m r NEM m–xik!). A dolog l‚nyege az, hogy a real-mode debuggerek legnagyobb r‚sze a futtatott program stackj‚t haszn lja saj t stackjek‚nt. Noteh t, amennyiben l‚p‚senk‚nt hajtunk v‚gre egy progot, akkor egy l‚p‚s sor n iszonyatos stackm–veletek k”vetkeznek be a debuggeren bell  teh t, ha felhaszn ljuk a fent megemlĄtett t‚nyt, ‚s egy olyan (ak r fals, egy halom MOV-val ‚s egyebekkel) programr‚szt futtatunk, ami NEM haszn lja a stackot, Łgy, hogy a Stack Pointert ennek a programr‚sznek az elej‚re  llĄtjuk, akkor, amennyiben a fent emlĄtett z–r”s m˘dszerekkel k”vetjk a progot, term‚szetesen a debugger az ‚pp v‚grehajtand˘ k˘dterletet szemeteli be. Persze az elj r s hat stalan nem l‚p‚senk‚nti v‚grehajt sn l, ill. TD386 alatt, ui. az teljesen szepar lt, az user  ltal nem l that˘ stacket haszn l. Persze TD alatt RUN ‚s Global Memory Check eset‚n szint‚n bek”vetkezik az ”sszeoml s (ha norm l F9/F4/szubrutin-F8 eset‚n nem is). rdemes mindenk‚pp kipr˘b lni! .model small .code CLI MOV AX,SS ;AX-be mentjk a k‚s“bbi visszaĄr shoz SS-t ‚s BX-be SP-t. MOV BX,SP PUSH CS POP SS ;SS := CS MOV SP,offset pp ;amenyiben TD alatt, a TDH386.SYS bet”lt‚se n‚lkl l‚p‚senk‚nt hajtunk v‚gre vagy Global Mem. Checket k‚rnk, itt omlik ”ssze a rendszer STI PP: NOP ;ide rakjunk egy halom utasĄt st, ami nem nagyon (ha IP megfelel“en t vol van m r pp-t“l, m r nem lesz baj) b ntja a stacket, ‚s AX/BX-et sem rontja el (amiket persze n‚gy NOP kiad sa ut n m r szintŁgy lementhetnk  PUSH-sal!). CLI MOV SP,BX MOV SS,AX STI MOV AH,4CH INT 21h end No, amire sz‚p p‚ld kat l thatunk a m r emlĄtett Mega-Em-ben (m‚g ez a legegyszer–bb a HYPERLOCK 386-ban, sz˘val ne ”rljetek!), az szintŁgy az utasĄt sk˘dokkal manipul l. A dolog l‚nyeg‚t el‚g neh‚z megmagyar zni, 'azt l tni kell'. Akinek m‚gsem lenne Mega-Em, az‚rt megpr˘b lom ”sszefoglalni: a l‚nyeg az, hogy egy CRC ”sszeget k‚pznk az eddigi k˘dr˘l, a jelenlegi utasĄt st is belesz mĄtva, ‚s ezt sem norm l l‚p‚senk‚nti v‚grehajt ssal nem lehet debuggolni (csak ha alaposan ut nagondolunk a dolog logik j nak, l sd a k˘d ut ni megjegyz‚seket), sem F4-gyel, ha a m‚g dek˘dolatlan k˘d felett adn nk ki azt, sem az F9-cel oper l˘ min‚l koraibb Ctrl-Break, mert akkor m r a dek˘dolt r‚szt bizony t”r”lten tal ln nk (miut n a debugv‚delem a feladat t elv‚gezte, t”rli mag t). N‚zzk meg a k”v. k˘dot (HyperLOCK 386, Mega-Em 2.00B023 Beta): cs:01CA FA cli cs:01CB BF2301 mov di,0123 cs:01CE B011 mov al,11 cs:01D0 B94806 mov cx,0648 cs:01D3 2E8A25 mov ah,cs:[di] cs:01D6 81FFEA01 cmp di,01EA cs:01DA 7203 jb 01DF cs:01DC 2E3005 xor cs:[di],al cs:01DF 47 inc di cs:01E0 2AC4 sub al,ah cs:01E2 D0E8 shr al,1 cs:01E4 32C4 xor al,ah cs:01E6 D0C0 rol al,1 cs:01E8 E2E9 loop 01D3 cs:01EA 3D9230 cmp ax,3092 cs:01ED 99 cwd cs:01EE BB0DF4 mov bx,F40D cs:01F1 18BE091E sbb [bp+1E09],bh cs:01F5 CB retf cs:01F6 C821535D enter 5321,5D Nem v‚letlenl van kl”nb”z“ bet–tĄpussal szedve a k˘d. Az els“ r‚sz nagyon cseles: cs:0123-t˘l (itt kezd“dik a HyperLOCK 386 Copyright zenete) elkezdi a mem˘ri t olvasgatni, s ek”zben AL-ben egy XOR-t k‚pez, 11h kezd“‚rt‚kkel. Hogy is k‚pzi a XOR-t? Term‚szetesen Łgy, hogy a k˘dterletr“l utasĄt sk˘dokat olvas. Milyen k˘dterletr“l olvas? Nono, mindj rt az aktu lisr˘l, baj van gyerekek, a debugger  ltal beszŁrt CCh ezt a XOR-k‚pz‚st garant ltan elrontja majd, hogyha pont ezt a CC-t olvassa be a mov ah,cs:[di] utasĄt s! Hogy lehetne ezt kiv‚deni? Pr˘b ljunk esetleg a loop ut ni, imm r italic-kal szedett k˘dr‚szlet valamelyik byte-j ra pozĄcion lni, ‚s ott F4? Nem tŁl j˘ ”tlet, ugyanis ugyanaz lesz a probl‚ma, mint eddig  ui. azt a CCh k˘dot is fel fogja a program haszn lni a toov bbi k˘dr‚szletek vissza-XORol s ra, amin ‚ppen  llunk, arr˘l nem is sz˘lva, hogy, mivel az italic k˘dot a program r ad sul  t is Ąrja, az is k‚rd‚ses lesz, hogy egy ltal n valaha visszakapjuk-e a Turbo Debugger vez‚rl‚s‚t  ugyanis ha a Turbo Debugger  ltal 'l thatatlanul' behelyezett CCh byte-ot valami  tĄrja, akkor bizony l“ttek annak, hogy a TD ott aktiviz l˘djon, ahol mi akarjuk. Nagyon komoly teh t a probl‚ma  ‚s az ember itt veti be sok‚ves c0dertud s t. Hiszen nem k”telez“ debuggerrel nyomonk”vetni egy EXE-t  mi lenne, ha ‚ppens‚ggel egyszer– file-k‚nt ‚rn‚nk el azt? Persze egy rahedli j rul‚kos utasĄt sra szs‚gnk lesz  hiszen term‚szetes, hogy az eddigi szimpla mem˘riael‚r‚s helyett file-b˘l kell byte-okat t”lt”getnnk ‚s rajtuk ugyanazokat a matematikai/logikai m–veleteket elv‚geznnk, mint ahogy a fenti code is teszi (valamint az erem‚nyt is file-ba Ąrjuk ki). N‚zz‚tek meg az al bbi k˘dot, ‚s hasonlĄts tok ”ssze a m–k”d‚s‚t a fenti rutinnal! .model small .386 .data FNameIn db 'megaem.exe',0 FHandleIn dw 0 ;filehandle  az Input file-‚! FNameOut db 'nocode.exe',0 FHandleOut dw 0 Buff db 0 ;azany d, te MS-LOSS, hogy nem tudsz k”zvetlen regiszterbe olvasni/Ąrni file-b˘l/-ba! .code mov ax,@data ;sp‚ci TASM direktĄva, DS-szel r mutatunk a k˘dszegmensre mov ds,ax mov dx, offset FNameIn mov ax, 3d00h ;open int 21h mov byte ptr [FHandleIn], al mov dx, offset FNameOut mov ax, 3c00h ;create mov cx,0 int 21h mov byte ptr [FHandleOut], al mov edi,0 ;di:=0 (egyik sz ml l˘) mov al,11h mov ecx,0648h+16173h ;m sik sz ml l˘ mov edi,0 hha: pusha ;a forr sfile-b˘l beolvassuk a k”vetkez“ byte-ot mov bx,FHandleIn mov ax,3f00h mov cx,0001 mov dx,offset Buff ;a Buff byte-ba, amit persze majd  tt”ltnk az akkuba int 21h popa mov ah,Buff mov dh,ah ;mi‚rt is van erre a ment‚sre szks‚g? Ha megn‚zzk a jb alatti xor cs:[di],al utasĄt st, l tjuk, hogy a XOR k”vetlenl mem˘ri t Ąr. Mi viszont az akkuban tartjuk a file adott byte-j t  azt  txorolva (xor ah,al) az eredeti byte elveszne. Arra pedig szks‚g van (pr˘b lj tok futtatni Łgy debugger alatt a progot, hogy ezen, valamint a fileba (visszaĄr s) ut ni utasĄt st kiszeditek, ‚s k”vess‚tek figyelemmel AH/AL v ltoz s t!) cmp edi,01623ah jb No_xor_yet xor ah,al No_xor_yet: mov Buff,ah pusha ;visszaĄrjuk a byte-ot. Ha a fenti Italic titkosĄtott k˘dr‚szt m r el‚rtk, akkor m r a vissza-xor-oltat (l sd a cmp/jb utasĄt sp rost)! Felmerlhet a k‚rd‚s, honnan tudjuk, milyen ‚rt‚kt“l kell a XOR-ol st elv‚gezni, ugyanis itt a teljes file-t  tm soljuk, ‚s nem csak a visszatitkosĄt st v‚gezzk el. Jobb c0derek term‚szetesen el“veszik a TDUMP-ot, 16-tal felszorozz k a paragrafussz mot, hozz adj k a CS:IP 20 bitre  tsz mĄtott ‚rt‚k‚t, ‚s ehhez hozz adj k 00ea-t. Kezd“knek egyszer–bb, b r kev‚sb‚ elit m˘dszer a visszaXORoland˘ r‚sz byte-jainak megkeres‚se az EXE-ben: Volkov Commander, F3, F4, F7, 3d923099bb0d  ‚s voil , megvan a 1623a! mov bx,FHandleOut mov ax,4000h mov cx,0001 mov dx,offset Buff int 21h popa mov ah,dh ;visszat”ltjk a file eredeti tartalm t inc edi cmp edi,16174h ;ez kl”n”s lehet, de ne feledjk, itt az eg‚sz file-t m soljuk, mĄg maga a XOR-‚rt‚ket sz mĄt˘ programr‚sz annak csak egy kis t”red‚k‚t, nevezetesen a 16173h-t˘l (fejl‚chossz*16+([1603:0100]=16130)+0023) kezd“d“ k˘dr‚szletet XOR-olja. jb no_need_to_compute_CRC sub al,ah shr al,1 xor al,ah rol al,1 no_need_to_compute_CRC: dec ecx jne hha mov bx, FHandleOut mov ax, 3e00h ;close outfile int 21h mov ah,4ch int 21h end Na persze nem kell mindig  gyŁval l“ni a ver‚bre... Aki jobban szemgyre veszi az els“ code visszatitkosĄt˘ rutinj t, az r”gt”n l tja, hogy az sem egy rossz m˘dszer, ha pl. 01e8-ra  llunk, ‚s err“l a helyr“l el nem mozdulva, F4-ezgetve DI-t engedjk felmenni mondjuk 01e0-ig. Vegyk ‚szre, hogy ekkor m‚g DI tŁl alacsony ahhoz, hogy bajt okozzon a debugger  ltal 01e8-ra beszŁrt CCh. Ekkor a kurzorral visszamegynk 01d6-ra, ‚s ott folyatjuk az F4-ez‚st  ezt a cĄmet pedig m r elhagytuk DI-vel, sz˘val a 01d6-on lev“ 'l thatatlan' CCh sem okoz probl‚m t, hisz a DI l‚nyegesen felette j r m r. S val˘ban  a CCh-t egyszer sem kalkul lta be a rutin a CRC ”sszegbe (hisz a debuggol s els“ r‚sz‚ben n la l‚nyegesen kisebb, m sodik r‚sz‚ben pedig nagyobb mem˘riacĄmekr“l olvastunk). Ennek ellen‚re nem haszontalan meg‚rtnnk, hogyan kell kls“ file-k‚nt CRC-”sszeget k‚peznnk egy programr˘l  Ągy a legt”bb, sokkal rond bb trkk”ket (pl. minden ciklusban van egy INT 3, minden ciklus v‚gigfut az eg‚sz aktu lis k˘don, ‚s a ciklusokb˘l mondjuk legyen 0ffffh darab  ezt k‚zzel elint‚zni (minden ciklusban  tĄrni az ‚pp olvasott k˘db˘l sz rmaz˘ byte-o(ka)t, l sd k‚s“bb) embertelen dolog, m‚g makr˘kkal is!) alkalmaz˘ antidebug k˘dok is leszedhet“ek vele. Egy fokkal nehezebb eset: a fenti ciklusban van egy p˘tl˘lagos XOR-t/egyebet v‚grehajt˘ INT3/INTO hĄv s, pl. 01df-en (ut na r”gt”n j”n az inc di, egy byte-tal Ągy az eg‚sz k˘d eltolatott!). Ahogy kell, az egybyte-os INT3/INTO utasĄt sokat kicser‚ljk egy k‚tbyte-os int 0f0h-ra, arra tekintettel l‚ve, hogy az interrupt rutin v‚g‚n a k‚tbyte-os utasĄt sk˘d  ltal megsemmisĄtett k”vetkez“ utasĄt st is hajtsuk v‚gre, ami itt szerencs‚nkre egy egybyte-os, r ad sul csak regisztert m˘dosĄt˘ INC (akkor lenn‚nk gondban, ha egy mov cs: tĄpusŁ utasĄt s lenne, hisz j˘l tudjuk, ha k‚zzel Ąrunk be egy interrupt rutint, az  ltal ban m s szegmensbe kerl, mint a program (meg lehet persze csin lni azt, hogy a debuggolt k˘ddal azonos szegmensbe Ąrjuk (k”zvetlen mem˘riaĄr ssal), de akkor sokszor fell k‚ne Ąrnunk m s k˘dot, ha nem lenne el‚g szabad mem˘ri nk amellett) -> CS m s. Ilyenkor, ha CS ‚s DS azonos szegmenst cĄmez a f“programban, nincs gond, a CS prefixet DS-re  tĄrjuk. gy, amĄg csak DI-t nem n”veljk 01df-re, nincs gond (a DI  ltal cĄmzett mem. olvas s, ne feledjk, 01d3-on van: cs:01D3 2E8A25 mov ah,cs:[di]). S Ągy, amikor DI-t az interrupt rutinunk megn”veli, ‚s az IRET ut n a LOOP-r˘l visszaugrunk cs:01D3-ra, akkor kezd“dnek a neh‚zs‚gek, amelyek megold sa viszont hihetetlenl egyszer– ‚s logikus: mivel a DI-vel cĄmzett k˘dot AH-ba olvassuk be, a CC (INT 3 k˘dja) helyett olvasott CD (INT() k˘dja) beolvas sa ut n egyszer–en  tmegynk a REGS red“nybe, r  llunk az AX-re, ‚s betjk annak Łj ‚rt‚kek‚nt a CCXX-et, ahol XX az eredetileg AL-ben lev“ XOR”sszeg (vigy zzunk, azt nehogy elg‚peljk, hisz az a lelke az eg‚sz tov bbhalad sunknak, ha 1 bit rossz benne, m r az ‚letben nem tudjuk vissza-XOR-olni a titkosĄtott r‚szt!). Ugyanez vonatkozik a k”v. utasĄt sra, amikor a 47 (INC DI k˘dja) helyett az FA-t (az el“z“ INT argomentuma) olvassuk. Ekkor AH-t 47-re  tĄrjuk, ‚s minden rendben, DI-vel m r nem cĄmznk majd  tĄrt utasĄt sk˘dŁ k˘dcĄmeket, tov bb is mehetnk F4-ezve, s ha DI tŁlhalad 01ec-n (01ea+1+1, mert egyr‚szt felt‚teleztk, a titkosĄtott k˘d most, a p˘tl˘lagos egybyte-os INT3 miatt 01ea helyett 01ea+1-en kezd“dik, valamint annak els“ byte-j t vissza kell XOR-olni, hogy oda a debugger m r biztons ggal helyezhessen egy CC t”r‚spontot, amikor r  llva (01eb: push ds, mint majd l tj tok) F4-et nyomunk), akkor m r alkalmazhatjuk az eg‚sz ciklust v‚grehajt˘ F4-et a 01ebh-ra  llva. Ennyit a kl”nb”z“ debug-ellenes trkk”kr“l ‚s azok legy–r‚s‚r“l. A legutols˘ trkk ma a leg-ink bb haszn lt ‚s legismertebb, de az ismertetett m˘don, egy kis g˘gyival nagyon egyszer–en le-kzdhet“. Mellesleg, aki a r‚gi SCANNER-ekben szeretne kutakodni, a j”v“re gondolva elhelyeztnk benne 1-2 INT 3-at. T”lts‚tek be TD al  a progot, F9, majd v lassz tok ki azt a cikket, amit le akartok menteni file-ba. Nini, decrunchol a program, majd visszaadja a TD promptot egy INT 3-on! Na ‚s hol a cikk? DS:0-t˘l, max. 64k-n. Ezek ut n sima blokkĄr ssal (a Data red“ny”n Ctrl/B ‚s W) m r kirakhatj tok textfile-ba. 1 perc alatt kiszedhettek Ągy b rmilyen textfile-t ezen r‚gi SCANNER-ekb“l, ‚s nem is kell m‚g a decrunchert sem megfejtenetek. A bilenty–zetkioszt s ‚s a glob lis/lok lis menk ”sszefoglal sa A program legf“bb debug-billenty–i m r j˘l ismertek a Borland-keretrendszerekb“l, Ągy azokat csak v zlatosan tekintem  t. Tulajdonk‚pp ezt a megleghet“sen terjedelmes r‚szt el akartam hagyni, de nem akartam magamra vonni azzal a sz”veggel sokak haragj t, hogy 'olvass tok el minden menponthoz a hozz tartoz˘ angol helpet'. De legal bb j˘ ”sszefoglal sk‚nt szolg l az eg‚sz leĄr s v‚g‚n. Arr˘l nem is sz˘lva, hogy egyp r olyan lehet“s‚gr“l is sz˘ esik most, ami hasznos (pl. Clipboard ‚s a History), de nem volt a t rgyal s ra hely. Hotkey-ek: F1: help, el‚g gyenge F2:Breakpoints/Toggle: a kurzor sor n  tal nos (always, break, 1) breakpointot hoz l‚tre, ill. b rmilyen, ott l‚tez“ bp-t t”r”l. F3:View/Module: modult”lt‚s (m s forr st vagy ak rmi m s f‚jl behĄvhatunk) F4:Run/Go to Cursor: a kurzor pozĄci˘j ig futtatja a programot. Kl”nbs‚g az F9-hez k‚pest, hogy ez meg llĄtja a programfut st az adott soron. F5:Window/Zoom: az aktu lis ablakot a teljes k‚perny“t bet”lt“re nyitja, ill. vissza llĄtja norm l nagys gŁra. Funkci˘ja azonos a Windows-b˘l j˘l ismert jobb fels“ sarokbeli kapcsol˘kkal. F6:Window/Next Window: a k”vetkez“ sorsz mŁ ablakra v lt, azt aktiviz lja. Mellesleg egyszer–bb Alt+sz m-mal v togatni az ablakok k”z”tt. F7:Run/Trace Into: a module ablakban egy forr ssort v‚grehajt (ez persze, nelvt“l fgg“en, t”bb igazi assembly utasĄt s v‚grehajt s t is jelentheti). Az Into jelent‚se: nem hajtja v‚gre egy az egyben a CALL-os fggv‚nyhĄv sokat. F8:Run/Step Over: mint az el“z“ pont, de itt a fggv‚nyhĄv sokba NEM l‚p be, azokat egy l‚p‚sben, a 'h tt‚rben' hajtja v‚gre. F9:Run/Run: a program elindĄt sa az aktu lis CS:IP-t“l. Fut˘  llapotb˘l a k”vetkez“ esetekben t‚rhetnk vissza TD al : -Ctrl/Break-ot nyomunk -INT3-ra vagy valamilyen t”r‚spontra ‚rkezett a program -valami hiba l‚pett fel (csak a TDH386.SYS jelenl‚t‚ben, kl”nben  ltal ban fagy a program, ha ‚pp nincs szerencs‚nk). F10:f“men. Alt-F1: Help/Previous Topic: a legutols˘ helpk‚perny“t hozza el“. Alt-F2: Breakpoints/At: ugyanaz, mint az F2, csak itt F2-z‚s ut n nem kell kl”n bel‚pnnk a Breakpoints/At menbe, hogy esetlegesen  tt llĄtsuk az always/break/1 param‚tereket  a bel‚p‚s automatice megt”rt‚nik (‚s nem kell F2-t nyomnunk). Alt-F3:Window/Close: z rja az aktu lis ablakot, vagy minden Inspector ablakot. Alt-F4:Run/Back Trace: visszal‚p eggyel. Alt-F5:Window/User Screen: megmutatja a debuggolt program k‚perny“kimenet‚t, ha van olyan. Nem szabv nyos VGA m˘dokat nem tud vissza llĄtani, ‚s a Full graphics save-re is kl”n kell megk‚rni, amikor a videomem elej‚t (azaz a TD  ltal haszn lt karakteres k‚pernynem szemeteli ”ssze. Alt-F6:Window/Undo Close: kinyitja az utolj ra bez rt ablakot. Alt-F7:Run/Instruction Trace: egyetlen utasĄt st hajt v‚gre. Alt-F8:Run/Until Return: ha egy CALL-lal hĄvott rutinban vagyunk, akkor azt addig futtatja el“re, amĄg egy RET-re nem ‚r. Nagyon hasznos, ha egy j˘l ismert rutinba akaratlanul l‚ptnk be ‚s onnan miel“bb ki akarunk keveredni. Alt-F9:Run/Execute To: megadott cĄmig futtat (= Alt-F2+F9). Alt-F10: az ‚pp ‚l“ ablak lok lis menj‚t ‚leszti fel, NAGYON FONTOS billenty–! Alt-1-9: az aktĄv ablakok k”z”tt kapcsolgat. Ha source-ot debuggolunk, akkor a Module ablak lesz az 1. ablak, mĄg a v ltoz˘k megfigyel‚s‚re szolg l˘ Watch a m sodik. Term‚szetesen, ha el‚g gyesek vagyunk, ezen ablakokat Łgy egym s mell‚/al  tudjuk helyezni, hogy csak gyors v ltoz˘t”rl‚sekhez stb... kelljen pl. a Watch-ablakba  tr ndulni, m skl”nben ne kelljen kl”n billenty–nyom sokkal el“hĄvni, ha a debuggol s k”zben valamelyik v toz˘ ‚rt‚k‚re voln nk kĄv ncsiak. Alt-B,D,E,F,H,O,R,V,W: a f“men azonos kezd“bet–j– almenit hozza be. Alt-X: File/Quit: kil‚p‚s, ir ny a DOS (vesz‚lyes lehet, ha pl. a prog  tĄrta az id“zĄt‚seket-pl. egyes ModPlayerek). Alt-=:Options/Macros/Create: egy makr˘ r”gzĄt‚s‚t kezdi el (l sd a makr˘kr˘l Ąrt r‚szt!). Alt--: ez pedig ugyanazt befejezi. Ctrl-F2: Run/Program Reset: Łjrat”lti diszkr“l a programot ‚s CS:IP-t vissza llĄtja, ugyanakkor az esetleg f rads gosan be llĄtott breakpoint-okat szerencs‚re nem t”rli. Ctrl-F4:Data/Evaluate: egy logikai kifejez‚st ki‚rt‚kel (l sd a kifejez‚sekkel foglalkoz˘ fejezetet!). Ctrl-F5:Window/Size/Move: ablakmozgat s/m‚ret llĄt s Ctrl-F7:Data/Add Watch: a Watch ablakhoz f–z egy Łj, megfigyelend“ v ltoz˘t. Amennyiben az ablak betelne, onnan a TD a legr‚gebben bef–z”tt v ltoz˘t kil‚pteti. Ctrl  jobb kurzor: a Code/Data/Stack ablak kezd“cĄmeit eltolja felfel‚ eggyel. Kl”n”sen a Data ablakn l van nagy jelent“s‚ge, mert Ągy sokkal k”nnyebb valamit lesz ml lni, mint ha nem mozgatn nk az adatokat, csak ujjal k”vetn‚nk. Ctrl  bal kurzor: a Code/Data/Stack ablak kezd“cĄmeit lefel‚ taszig lja. Mint el“bb. Shift-F1:Help/Index: a Help-et hĄvja, de r”gt”n az Łn.  ltal nos indexet hozza el“, ahol a kurzor pozĄcion l s val v laszthatjuk ki, mi is ‚rdekel bennnket. Shift-F3:Edit/Copy: az Łn. Clipboard-ba m solja a kijel”lt, ill. a kurzor alatt  ll˘ elemet (nem kell Łjra g‚pelni, ha a kl”nb”z“ ablakokban szeretn‚nk ugyanazt a nevet megadni). Shift-F4:Edit/Paste: ez pedig az el“bb a Clipboard-ba berakott elemet a kurzor hely‚re m solja (norm l ablakba vagy ‚ppens‚ggel egy p rbesz‚d-sorba (mint pl. a Bpoints/At beĄr˘sorai)). Shift-Tab: visszafel‚ mozgatja a kurzort (az ablakok k”z”tt, a Tab-f‚le Code-Regs-Flags-Stack-Data(-Code) ir nnyal ellent‚tben ‚pp fordĄtva). Shift  jobb ‚s a t”bbi kurzrbill.: mint a TAB, de ez r”gt”n a megadott ir nyba mozdĄt. Esc: az Inspector ablakok csuk sa, menkb“l ‚s p rbesz‚dablakokb˘l val˘ kil‚p‚s. Ins: sz”vegkijel”l‚s kezdete A men ”sszes parancsa A k‚perny“ tetej‚n l that˘ ment F10-zel kelthetjk ‚letre, s ut na a jobb-bal kurzormozgat˘ billenty–kkel mozoghatunk a f“men pontjai k”z”tt; az almenket, r juk vive a kurzort, Enter-rel v laszthatjuk ki, vagy k”zvetlenl a kezd“bet–jk megnyom s val (amennyiben a kurzor nincs a f“men fejl‚c‚n, Łgy ezzel p rhuzamosan m‚g egy ALT-ot is nyomnunk kell). A System men: -Repaint Desktop: az eg‚sz k‚perny“t Łjra fel‚pĄti, hasznos, ha tŁl sok mindent el llĄtottunk. Restore Standard: a szabv nyos ablak-elhelyez‚st visszahozza. About: inf˘ a TD-r“l (verzi˘sz m stb...) A File men: Open: Łj progrramot t”lt be debuggol sra (alap‚rtelmez‚s: kurrens k”nyvt r ‚s *.EXE) Change Dir: m s diszkre vagy k”nyvt rra v lthatunk Get Info: program inf˘ lek‚r‚se (pl. van-e lehet“s‚g hardware debuggol sra, azaz ‚l-e a TDH386.SYS stb...) DOS Shell: kiugrik DOS-ba, a diszkre mentve egy Łn. swapfile-t, ezzel meglep“en nagy mem˘ri t enged‚lyezve a futtatand˘ program sz m ra. Vigy zzunk a TD386-tal, mert az nem csin l swapfile-t, Ągy sokszor csak 100-200k szabad mem˘ri t enged‚lyez! Resident: rezidensk‚nt (Ctrl-Pause-zal, ill. esetlgesen be llĄtott t”r‚spontokkal hĄvhat˘) bennhagyjuk a TD-t a mem˘ri ban. Symbol Load: a NEM az EXE-ben lev“ szimb˘lumt bl t bet”lti. Table Relocate: ‚s annak szegmens‚t be llĄtja. Quit: vissza a DOS-ba, kil‚p‚s. Az Edit men: Copy: a Clipboard-ba m sol vmit (kurzor alatti kifejez‚st, vagy INS-tel kijel”lt tartom nyt). Paste: a Clipboard-b˘l m sol a kurzor aktu lis hely‚re Copy to Log: az INS-tel bejel”lteket (v. a kurzor alatti kifejez‚st) kirakja a LOG ablakba (ahonnan be llĄthat˘an tov bbkldhetjk file-ba is). Dump pane to Log: az aktĄv ablakr‚sz teljes tartalm t, a keret felirataival, szint‚n LOG-ba rakja. A View men: Breakpoints: a breakpoint-ok ”sszesĄtett list ja, legontosabb param‚tereikkel (Alt-F10!) Stack: a stacket mutatja meg (huh, de neh‚z lehet kital lni...) Log: l sd a Log-r˘l Ąrottakat (a breakpointok, az Edit/Copy to Log ‚s Edit/Dump pane to Log  ltal (stb...) LOG-olt dolgokat n‚zhetjk meg itt (m‚g akkor is, ha p rhuzamosan file-ba is Ąratunk)). Watches: Watches-ablak, azaz az  lland˘an kiĄratott ‚rt‚k– v ltoz˘k ablaka. Variables: a glob lis ‚s lok lis v ltoz˘kat mutatja (csak ha van source). Module: ha van source, ‚s nem Mixed a kijelz‚si m˘d, annak kl”n ablak ra v lt. File: kls“ file-t ASCII-k‚nt vagy hexak‚nt megmutat. CPU: a lefordĄtott, majd visszadisassembl lt g‚pi k˘d ablaka. Ha nincs sourcer, akkor term‚szetesen a default ablak, hasonl˘an, ha Mixed kijelz‚st k‚rnk. Ezen fell a Dump, Regs, Flags ‚s Stack red“ny”ket (pane) is tartalmazza. Dump: adatk‚nt val˘ kijelz‚se egy adott mem˘ri nak, alapesetben 8 egym s melletti byte, k‚perny“sz‚less‚g–re nyitott ablakn l 16; v ltoztathat˘ form tum. Registers: csak a CPU regisztereit ‚s flag-jeit mutatja meg. Numeric Processor: a koproci/emu regisztereit mutatja. Execution History: a visszal‚p‚shez elt rolt assembler k˘dot mutatja meg. Clipboard: a Clipboard ablakot mutatja meg, Ągy szemrev‚telezhetjk az oda m solt k˘dr‚szleteket, v ltoz˘kat stb... Another: j˘ szolg ltat s, ha a source-unk rengeteg include file-b˘l  ll, ‚s ezek k”zl egyszerre t”bbet akarunk a k‚perny“n l tni; hasonl˘ az eset akkor, ha pl. mind DS:SI, mind ES:DI-re szeretn‚nk kl”n Dump ablakot nyitni. -Module: Łj Module ablakot nyit (egyszrre t”bb source figyelhet“) -Dump: Łj mem˘riadump-ablak nyit sa -File: egyszerre t”bb file tartalm t is k‚zn‚l tarthatjuk. A Run men Run: programfuttat s, a m r emlĄtett stop-lehet“s‚gekkel (be llĄtott F2 vhol, Ctrl-Break stb...). Go To Cursor: az aktu lis CS:IP-ig futtat, azt m r nem hajtja v‚gre. Hasonl˘an, a shortcut-okn l m r leĄrtam, mire val˘k a k”v. menpontok: Trace Into, Step Over, Execute To, Until Return, Back Trace, Instruction Trace, Program Reset. A Breakpoints men: err“l is volt m r sz˘, ez‚rt nem r‚szleteztem kl”n”sen, csak eml‚keztet“-jelleggel: Toggle (F2): a kurzor sor n always/break/1 t”r‚spontot iktat be, ill. t volĄt el. A shortcut-okn l m r az At...-et is t rgyaltam. Changed Memory Global: glob lis, teh t minden utasĄt sv‚grehajt s ut n tesztelt v ltoz sa egy megadhat˘ mem˘riaterletnek. Expression True Global: egy logikai kifejez‚s teljesl‚se eset‚n glob lis (definĄci˘ el“bb!) t”r‚spontot ‚lesĄt, azaz azonnal meg ll. Hardware Breakpoint: a Breakpoints-okr˘l sz˘l˘ fejezetben ismertetett felt‚telekkel ‚s lehet“s‚gekkel HW t”r‚spontot helyez el. Delete All: minden t”r‚spontot t”r”l. A Data men Inspect: egy v ltoz˘ stb... ‚rt‚k‚t megmutatja egy termin l˘d˘ ablakban. Evaluate/Modify: egy kifejez‚s ‚rt‚k‚t ki‚rt‚keli (ha van source) Add Watch: a Watches ablakhoz Łj kifejez‚st (v ltoz˘t stb...) f–z, hogy annak pillanatnyi ‚rt‚k‚t minden olyan esetben l thassuk, amikor n lunk van a TD prompt. Function Return: megmutatja az aktu lis fggv‚ny visszat‚r‚si ‚rt‚k‚t. Az Options men: Language: a source nyelv‚t  llĄtja be/ t. T”bbsz”r t rgyaltam a default fellbĄr l s nak hasznoss g t. Macros -Create: makr˘r”gzĄt‚s indĄt sa (l sd a makr˘kr˘l sz˘l˘ fejezetet!) -Stop Recording: az emlĄtett okok miatt hasznosabb a shortcut-j t, azaz Alt---t nyomni. -Remove: egy makr˘t t”r”l a mem˘ri b˘l, Ągy a hozz  rendelt billenty– visszakapja eredeti funkci˘j t. -Delete All: minden makr˘t t”r”l. Display Options: a k‚perny“jellemz“k  llĄt sa: m‚ret, mi legyen a felhaszn l˘i program k‚perny“j‚nek megmutat s val stb... Path for Source: a forr sokhoz directory-lista ”ssze llĄt sa Save Options: a be llĄtott opci˘kat, a k‚perny“ fel‚pĄt‚s‚t (pl. a Dump ‚s a Module egym shoz k‚pesti helyzete, hogy ezt haszn ljuk m s programok debuggol sa eset‚n is) ‚s az ”sszes makr˘t konfigur ci˘s file-ba menthetjk. Alaphelyzetben csak az opci˘kat menti. A Restore Options ennek ellent‚te. A Window men: Zoom: =F5, a teljes k‚perny“t bet”lt“ m‚ret–v‚ 'hŁz ki' egy ablakot, m sodszori kiv laszt s ra pedig eredeti m‚ret‚re zsugorĄtja vissza. Next: a k”v. sorsz mŁ ablak kirak sa a k‚perny“re. Next Pane: az ”sszetett ablakok (pl. CPU ablak) alkot˘r‚szei k”z”tt v lasztja ki a aktu lis ut n k”v.-t (l sd: Tab, ellent‚te a Shift-Tab) Size/Move: ablakmozgat s, m‚retv ltoztat s Iconize/Restore: egy ablakot a lehet“ legnagyobb m‚rt‚kben ”sszezsugorĄt, ill. ama  llapot b˘l el“hŁz. Close: bez r egy ablakot. Undo Close: az utolj ra bez rt ablakot Łjra kinyitja. User Screen: Alt-F5, (j˘ esetben) megmutatja az ‚pp debuggolt program  ltal a k‚perny“re kiĄrt dolgokat. Ezut n, source n‚lkl, alapesetben egy 1 CPU menpontot l tunk. Amennyiben t”bb ablakot is kinyitunk (pl. View/Another), akkor azok sorsz ma ‚s r”vid megnevez‚se (pl. Dump at ds:0) ez al  sz‚p sorban felkerl. Ha 9-n‚l t”bb defini lt ablakunk lenne, akkor m r eleve az ablak fejl‚c‚n sem jelenik meg sorsz m, ‚s e menben, a 9 db ablakazonosĄt˘ list ja alatt megjelenik egy Window Pick. Ez imm r egy scrollozhat˘ ablak-v laszt˘ men. Itt is kiĄrattatnak a legfontosabb jellemz“k, valamint 10 alatti sorsz mŁ ablakokn l az Alt+sz mmal a shortcut-tal, azaz azonnal el‚rhet“ sorsz m. A Help men: Index: a segĄts‚g teljes, mindenre kiterjed“,  b‚c‚sorrendbe szedett index‚t hozza Previous Topic: az el“z“leg kinn volt Help-et id‚zi be Łjra Help on Help: hogy kell haszn lnunk mag t a Help-et? A lok lis menparancsok Minden kl”nb”z“ ablak, ‚s azon bell minden g”rdl“ablak saj t menvel rendelkezik, amelyek az ablakban v‚grehajtott m–veleteket eg‚szĄtik ki. Vil gos, hisz minek is lenne olyan parancs a f“menk vmlyik‚ben, hogy 'A LOG ablakot file-ba is Ąrd ki'  sokkal logikusabb ‚s  ttekinthet“bb azt akkor el‚rhet“v‚ tennnk, hogyha ‚pp a LOG ablakban matatunk. Az aktu lis ablak helyi menj‚t Ctrl-F10-zel hĄvhatjuk el“. Ha a Ctrl-billenty–s gyors el‚r‚s enged‚lyezett, akkor azonnal fel‚leszthetjk a kĄv nt utasĄt st, nem kell eme menb“l v logatnunk. Most a k”nnyebb el“kereshet“s‚g ‚rdek‚ben ABC sorrendben foglalom ”ssze az egyes almenk parancsait. Breakpoints ablak: k‚t red“nye van. Mivel a jobb oldalira 'nem mehetnk  t', hisz az csak a bal oldaliban scrollozott t”r‚spontok f“bb adatait villantja fel, Ągy ‚rtelemszer–en csak a bal r‚sznek van lok lis menje: Set Options: felt‚telek, cselekend“ dolgok, a 'pass count' (h nyadszori felt‚telteljesl‚s ut n ‚lesedjen a b.point) be llĄt sa, id“leges kiiktat s (<>F2!). Add: Łj breakpoint felv‚tele Remove:(=Del) az aktu lisan vizsg lt b.point v‚gleges t”rl‚se Delete All: minden b.point t”rl‚se (mint B.points/Delete all a f“menben) Inspect: megmutatja azt a k˘dot, ahova a t”r‚spont behelyeztetett. Group: l sd a B.pointokr˘l sz˘l˘ fejezet, az azonos oszt lyba sorolt B.pointokat egyszerre ‚leszti/fagyasztja stb... CPU ablak: ez 5 (Windows alatt 6, de ezzel most nem foglalkozom) red“nyt tartalmaz: Code, Data, Stack, Register, Flags. Code: Goto: a kurzort a megadott cĄmre helyezi (ha szegmenscĄmet nem adunk meg, akkor disassembl l sn l a szegmensk‚nt a default CS-t t‚telezi fel!), term‚szetesen a CS:IP-t NEM b ntja! Origin: ha a kurzor nem a CS:IP sor n  llna, akkor oda visszat‚rnk. Follow: az aktu lis sorban lev“ JMP/CALL v‚gcĄm‚re ugrik. Caller: itt pedig az adott elj r st CALL-lal hĄv˘ utaasĄt s k”rnyezet‚t mutatja meg. Previous: az el“z“ CS:IP  ltal cĄmzett utasĄt st mutatja. Search: utasĄt smneomnikokat is elfogadva, utasĄt sokat ill. adatbyte-okat kereshetnk. View Source:  tkapcsol a Module ablakra Mixed: nagyon kellemes lehet“s‚g, h rom  llapottal: No/Yes/Both, amennyiben l‚tezik source, akkor annak utasĄt sait k”zvetlenl a disassembl lt k˘dba belevegyĄttethetjk. New CS:IP: a Goto-val ellent‚tben ez m r CS:IP-t  tĄrja. Assemble: a kurzor pillanatnyi hely‚re berak egy,  ltalunk megadhat˘ assembly utasĄt st (ha valamit g‚pelni kezdnk az ablakban b rhol, az shortcut lesz ehhez az utasĄt shoz! Ezt a k”vetkez“kben a shortcut: r”vidĄt‚ssel illetem) I/O: az I/O ment hozza el“: In/Out Byte: egy byte-ot olvas, ill. Ąr a megahat˘ I/O portra/r˘l. Read/Write Word: mint el“bb, de szavakkal (vigy zzunk mind a n‚gy lehet“s‚ggel, a Read-okkal is, ha azok latcheltek!) Data: Goto, Search: ‚rtelemszer– Next: keres‚sn‚l a k”vetkez“ el“fordul st keresi Change: a kurzor alatti byte-ot, ill. ha egyszerre t”bb byte-ot adunk meg (a form tumr˘l m r sz˘ltam, vigy zzunk az Intel a szok sossal ellent‚tes sz mform tum ra, ha Intergerk‚nt vagy Longintk‚nt adunk meg a sz mokat!), akkor az akutu lis pozĄci˘t˘l. Shortcut: b rmit, b rhol g‚pelnk az ablakban. Follow: szint‚n kellemes lehet“s‚gek: egy gombnyom sra lek‚rhetjk, a Data ablakban a kurzor alatt lev“ 2, ill. 4 byte konkr‚tan MIRE cĄmez. Pl. ez ut˘bbi meg‚rt‚s‚re ‚rdemes lemenni mondjuk 0:0-ra (Ctrl-G, 0:0) ‚s ott nyomni egy Far Code-ot. L tj tok? Az Int 0 (amely cĄme a 0:0-n tal lhat˘) cĄm‚t nem kellett f rads gosan visszasz molni ‚s a Code ablakr‚szbe  tmenve, ott Ctrl-G-t kiadva beĄrni. A Near Code hasonl˘an m–k”dik, azzal a kl”nbs‚ggel, hogy itt a jelenlegi CS-hez tartoz˘ offsetnek tekinti a TD a kurzor alatt kezd“d“ word”t, azaz 2 byte-ot. Az Offset to Data ‚s a Segment:Offset to Data szint‚n uganezt a funkci˘t v‚gzi, de imm r NEM a k˘d, hanem az adat-ablakban pozĄcion l (az‚rt is van a hangsŁlyos elv laszt s az el“z“ kett“, valamint a t”bbi, csak a Data ablakban pozĄcion l˘ utasĄt s k”z”tt). A Base Segment:0 to Data egy kicsit m sk‚nt m–k”dik: a kurzor alatti word”t a rendszer szegmenscĄmnek tekinti, ‚s a Data ablakot arra az adatra  llĄtja, melynek szegmenscĄme ezen word, mĄg offsetcĄme 0. Previous: a legutols˘ cĄmmegad s el“tti cĄmre l‚pnk. Display As: megadhatjuk a kijelz‚s mik‚ntj‚t (a fordĄtott byte-sorrendre vigy zni!) Byte: default Word: hexa word”k Long: 32-bites sz mokk‚nt Comp: ‚s 8-byte-os Pascal compk‚nt Float: short, azaz 4-byte-os lebeg“pontos sz mook‚nt  br zolja az adott mem˘riatartom ny tartalm t (Pascal: single, C: float) Real: norm l 6-byte-os lebeg“pontos sz mokk‚nt  br zol (Pascal real) Double: 8-byte-os lebeg“ (Pascal and C doubles) Extended: 10-byte-os lebeg“ (C long double, Pascal extended) Block: blokkm–veletek, a kezd“cĄmet ‚s vessz“vel elv lasztva az ett“l a cĄmt“l sz mĄtott, ‚rintett byte-ok sz m t kell megadnunk. Clear: teljes t”rl‚s (0) Move: mozgat s. Szintaktika: forr scĄm,c‚lcĄm,h ny egys‚g. Set: mint a Clear, de itt megadhatjuk, mire  llĄtsa be a mem˘riatartom nyt. Read/Write: file-ba kiĄrathatunk egy tetsz“leges mem˘riatartom nyt, ill. oda bem solhatjuk. rtelemszer–en COM-okat Ągy b rhova bet”lthetnk, ahol az offsetcĄm oszthat˘ 16-tal (persze ut na m‚g CS:IP-t r  kell  llĄtanunk az els“ utasĄt s ra, Łgy, hogy az IP 0100 legyen). Flagok: Toggle: shortcut: Space/Enter, neg lja az aktu lis flag ‚rt‚k‚t. Register: Increment/Decrement: eggyel n”vel/cs”kkent (nagyon hasznos pl. INT 3-as debugellenes k˘dok debuggol s n l, amikor az INT 3  ltal behozott Łj INT IRET-je ut n vissza kell Ąrnunk a r‚gi INT 3-at ‚s az azt k”vet“ utasĄt st, valamint vissza kell Ąrnunk az azt k”vet“, az Łj INT XX k‚tbyte-os utasĄt sk˘dja miatt megsemmislt utasĄt st) Zero: null z Change: shortcutja a b rmit g‚pel‚s; k‚zi ‚rt‚kmegad s Registers 32-bit: No/Yes, 32-bites legyen-e a regiszterkijelz‚s vagy sem. Stack: Goto, Origin, Previous, Change: logik ja azonos a Data red“nyn‚l m r t rgyaltakkal (a Change itt is shortcut-olt!) Follow: a kurrens 2 byte  ltal mutatott k˘dra pozĄcion l a disassembly ablakban. Dump: ez az ablakfajta ugyanaz, mint a CPU ablak Data red“nye -> GOTO az. (View/)Execution History ablak: azokat a m‚g a megmutathat˘ hely–/ visszacsin lhat˘ utasĄt sokat mutatja, amiket ‚pp az im‚nt hajtottunk v‚gre, ha a Full History Yes-ben van. RendkĄvl hasznos szolg ltat s, ui. a TD egy bizonyos szintig elt rolja az utols˘ utasĄt sok el“tt fenn ll˘ mem˘ria, regiszter  ‚s IO-port-tartalmakat, Ągy nem kell Łjrat”lteni/futtatni a programot (annak minden nyavaly j val egytt, ha pl. INT3-ak ‚s egy‚b g ncsoskod sok voltak benne) ‚s kurzorral vissza llni, ha p r utasĄt ssal tŁll“ttnk a c‚lon. Inspect: megmutatja a red“nymenben ‚pp kiv lasztott utasĄt st ‚s k”rnyezet‚t a Code ablakban. Reverse Execute: visszafel‚ haladva minden id“k”zben elk”vetett IO/regiszter/mem˘riav ltoztat st meg nem t”rt‚ntt‚ tesz, ‚s persze CS:IP-t is vissza llĄtja. Mindezt a kurzor sor ig teszi, az ezen lev“ utasĄt st is bele‚rtve. Full History: ez kapcsolja be/ki (default) a visszal‚p‚si lehet“s‚get. File: a kls“ file-okat mutatja hex ban vagy ASCII-ben. Goto: hexa vagy sorcĄmre pozĄcion l Search: stringet vagy adatbyte-okat keres (shortcut: b rmit nyomunk) Next: a k”vetkez“ el“fordul st keresi (l sd: Search) Display As: ASCII/Hex k”z”tti v lt s File: Łj file-t t”lt be. Edit: a file-t  tĄrja, ak r ASCII, ak r hexa m˘dban irattass‚k is ki. Log: err“l m r el‚g sok sz˘ esett, ez‚rt NAGYON r”vid leszek. Open Log File: file-ba Ąrja a k”vetkez“kben a LOG ablakba Ąrott dolgokat (Close Log File: lez rja azt). Logging: No/Yes, id“leges kikapcsol s Add Comment: b rmit hozz f–zhetnk az adott LOG-sor ut n (shortcut!) Erase Log: teljes t”rl‚s a mem˘ria-LOG-ban. Module ablak: a source itt l that˘, ha van, ‚s enged‚lyeztk a kl”n ablakot (NEM Mixed m˘d!) Inspect: a kurzor alatti v ltoz˘ ki‚rt‚kel‚se (nem marad permanensen a Watch ablakban!) Watch: v‚glegesen berakja a kurzor alatti v ltoz˘t a Watch ablakba. Module: m s source-et t”lt (pl. ha egy programnak t”bb include modulja van, ‚s nem akarunk megfulladni a View/Another forr sdzsungel‚ben) az aktu lis ablakba. File: nemcsak modult, file-t is kiĄrattathatunk. Previous: az utols˘ modult t”lti Łjra be, ‚s a kurzorpozĄci˘t is vissza llĄtja. Line, Search, Next: szok sos. Origin, Goto: vissza ll a kurzorral a pillanatnyi programpozĄci˘ra, ill. el ll onnan (shortcut: goto). Edit: ks“ editort hĄv (TDINST-tal konfigur lhat˘ param‚terek), hogy a forr st  tĄrhassuk. Persze fordĄtani Ągy sem fogunk! Clipboard: f“leg az ablakok k”z”tti adatmozgat sra j˘ (kevesebb g‚pel‚s). Inspect: abba az ablakba ‚s azon sorba  ll, ahonnan az aktu lis kifejez‚st kihal sztuk, Ągy azt ki‚rt‚kelhetjk. Remove, Delete All: t”rl‚s Freeze: az aktu lis tartalmat az aktu lis ‚rt‚k‚re lefagyasztjuk. Numeric Processor ablak: h rom red“nye van, a Register, a Status ‚s a Control red“ny. Az ut˘bbi kett“ben csup n a Toggle parancs haszn lhat˘ (shortcut!), mĄg az els“ben a regiszterek  llĄt s ra a Zero/Empty/Change parancsok (shortcut: Change). Registers ablak: l sd a CPU ablak Registers red“ny‚r“l Ąrtakat! Stack ablak: az ‚pp aktĄv fggv‚nyek (csak source jelenl‚t‚ben!). Inspect: a forr st megmutatja (Enter!). Locals: ‚s annak lok lis v ltoz˘it (nagyon j˘, mert azokat Ągy ”sszegy–jtve  tn‚zhetjk!) Variables ablak: k‚t red“nye van, a Global Symbol ‚s a Local Symbol red“ny. Csak source jelenl‚t‚ben haszn lhat˘. Global Symbol red“ny: a glob lis szimb˘lumok lek‚r‚se. Inspect: tartalom (Enter) Change: ‚rt‚kv ltoztat s Watches: a Watches ablakba m solja a kurzor alatti v ltoz˘t. Local Symbol red“ny: az Inspect/Change/Watches az el“z“ho”z hasonl˘. Show: p rbesz‚dablakot nyit, a k”vetkez“ v laszt si lehet“s‚gekkel: Static: csak a statikus v ltoz˘kat mutatja. Auto: csak a lok lisakat mutatja (a kurrens blokkban!). Hat sa Ągy ugyanaz, mint ha a Local Symbol red“nyt n‚zn‚nk. Both: mindk‚t fenti tĄpust mutatja (default) Module: modult v ltoztat Watches ablak: egyetlen red“nyb“l  ll, a megfigyelt v ltoz˘kkal ‚s azok kurrens ‚rt‚keivel. Watch: Łj megfigyelend“ v ltoz˘t ad az ablakhoz. Edit: (=Enter) a v ltoz˘t/kifejez‚st edit lhatjuk (pl. m s t”mbindexek megad sa, vagy a ha a v ltoz˘ban p r bet–t kicser‚lve egyszer–bb egy Łj v ltoz˘ ‚rt‚k‚t lek‚rnnk, mint ha annak a teljes nev‚t beg‚peln‚nk) Remove: (=Del) az adott v ltoz˘t t”rli. Delete All: minden megfigyelt v ltoz˘t/kifejez‚st t”r”l. Inspect: az aktu lis v ltoz˘t ki‚rt‚keli. Change: a kifejez‚sek  ltal visszaadott ‚rt‚ket term‚szetesen nem v ltoztatja, viszont kl”n-kl”n a v ltoz˘k ‚rt‚k‚t fellĄrja. Mindenf‚le textablakok  ltal nos kezel“billenty–i: Ins: blokk-kijel”l‚s kurzorvez‚rl“k: pozĄcion l s Ctrl-balra ‚s jobbra: szavak k”z”tt ugr l s Home/End: az adott sor elej‚re/v‚g‚re  ll PgUp, PgDn: egy oldallal fel/le megy Ctrl-Home, Ctrl-End: a red“ny els“/utols˘ sor ra  ll (de nem a file-‚ra!) Ctrl-PgUp, Ctrl-PgOn: a file els“/utols˘ sor ra  ll Hasonl˘an kezeltetnek a listared“ny”k, amikor egy list b˘l valamit ki kell v lasztani. Itt a fel-le billenty–kkel lehet a lehet“s‚gek k”zl v lasztani, mĄg, amennyiben egy lehet“s‚g nem f‚rne ki az aktu lis vĄzszintes ablakm‚retbe, a bal/jobb nyilakkal (Home/End is itt m–k”dik) lehet scrollozni. Kerestetni sorban bet”tt v ltoz˘n‚v-bet– m˘don lehet, mint a Norton Commanderben. Itt, gyorskeres‚s k”zben, BackSpace-szel t”r”lhetnk visszafel‚. Nagyon hasonl˘ az input ‚s a v‚grehajt s-t”rt‚net list ja is. Az ablakmozgat sr˘l: legk‚nyelmesebb eg‚rrel megejteni, de billenty–zetr“l sem ”rd”ng“ss‚g. Ctrl-F5: ha megnyomjuk, a k”v. Enterig pozĄcion lhatjuk a kurzorvez‚rl“ gombokkal a kurrens ablakot b rhol a k‚perny“n (Enter: v‚glegesen lerakja). A Home/End-del a balra, ill. jobbratologat st takarĄthatjuk meg ilyenkor (sz‚lre kihŁz), a PgUp/PgDn-nal pedig a teljesen feltol st/lehŁz st. Amennyiben a kurzorvez‚rl“ gombokat a Shift-tel egytt nyomjuk, akkor az ablak jobb ‚s als˘ sz‚l‚t tologathatjuk a kurzorvez‚rl“k  ltal megszabott ir nyban. Enterrel elfogadtatjuk az ablak Łj hely‚t, Esc-pel pedig elutasĄttatjuk.