{"id":232,"date":"2007-04-21T15:26:42","date_gmt":"2007-04-21T14:26:42","guid":{"rendered":"http:\/\/soci.hu\/blog\/index.php\/2007\/04\/21\/nativ-kod-debugolasa-utmutato\/"},"modified":"2007-04-21T16:44:52","modified_gmt":"2007-04-21T15:44:52","slug":"nativ-kod-debugolasa-utmutato","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2007\/04\/21\/nativ-kod-debugolasa-utmutato\/","title":{"rendered":"Nat\u00edv k\u00f3d debugol\u00e1si \u00fatmutat\u00f3 10 percben"},"content":{"rendered":"<p>Szeretn\u00e9k n\u00e9mi seg\u00edts\u00e9get adni azoknak, akik nem \u00e1ltaluk \u00edrt nat\u00edv k\u00f3dot szeretn\u00e9nek debugolni. A p\u00e9ld\u00e1ban az Internet Explorert debugolom meg.<br \/>\nA nat\u00edv k\u00f3d\u00fa debugol\u00e1s rem\u00e9nytelen szimb\u00f3lumok n\u00e9lk\u00fcl, amelyek pdb f\u00e1jlokban laknak. Az MS minden modulj\u00e1hoz publik\u00e1l pdb f\u00e1jlokat, amelyek persze forr\u00e1sk\u00f3d inform\u00e1ci\u00f3t nem tartalmaznak, de a f\u00fcggv\u00e9nyek \u00e9s oszt\u00e1lyok neveit igen. Ezek a stripped pdb f\u00e1jlok.<br \/>\nEgy dll-hez, exe-hez a hozz\u00e1 pontosan passzol\u00f3 pdb f\u00e1jlra van sz\u00fcks\u00e9g. K\u00e9zzel igen neh\u00e9z lenne minden f\u00e1jlhoz \u00f6sszevad\u00e1szni a szimb\u00f3lumokat, f\u0151leg, hogy hetente j\u00f6nnek a hotfixek a g\u00e9pre. Ezen seg\u00edt a symbol szerver. Ez azt jelenti, hogy az ms minden modulhoz kirakja nyilv\u00e1nosan egy webszerverre a szimb\u00f3lumokat, amit a WinDbg vagy a VS mag\u00e1t\u00f3l le tud t\u00f6lteni.<br \/>\nA szimb\u00f3lumszervert be lehet \u00e1ll\u00edtani az _NT_SYMBOL_PATH k\u00f6rnyezeti v\u00e1ltoz\u00f3ban, vagy a VS-ben a Tool\/Options\/Debugging\/Symbols alatt.<br \/>\n<a href='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2007\/04\/vssymbolsettings.jpg' title='Visual Studio 2005 Debug Symbol be\u00e1ll\u00edt\u00e1sok'><img src='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2007\/04\/vssymbolsettings.thumbnail.jpg' alt='Visual Studio 2005 Debug Symbol be\u00e1ll\u00edt\u00e1sok' \/><\/a><br \/>\nN\u00e1lam \u00edgy n\u00e9z ki a k\u00f6nyezeti v\u00e1ltoz\u00f3:<br \/>\n_NT_SYMBOL_PATH=SRV*D:\\Debugging\\symbols*http:\/\/msdl.microsoft.com\/download\/symbols<br \/>\nD:\\Debugging\\symbols, ide t\u00f6lti le a debugger a symbol f\u00e1jlokat, \u00edgy az els\u0151 debugol\u00e1s lassabban indul el, de ut\u00e1na m\u00e1r ebb\u0151l a cache-b\u0151l veszi a pdbket.<br \/>\nN\u00e1lam ez a k\u00f6nyvt\u00e1r 600 mega, ebben az XP \u00e9s a Vista szimb\u00f3lumainak egy r\u00e9sze lakik.<br \/>\nJ\u00f6het a debugol\u00e1s. Az igazi macs\u00f3 debugol\u00e1s WinDbg vagy NTSD alatt lehets\u00e9ges, \u00e9n egyel\u0151re a VS-re mutatom be, de m\u00e1r tanulgatom a WinDbg-ot is.<br \/>\nL\u00e9trehozok a VS-ben egy \u00faj, \u00fcres solutiont, \u00edgy a t\u00f6r\u00e9spontok megmaradnak a debugol\u00e1sok k\u00f6z\u00f6tt.<br \/>\nDebug\/Attach-csal hozz\u00e1kapcsol\u00f3dok a m\u00e1r fut\u00f3 processzhez, eset\u00fcnkben az IExpolere.exe-hez. Mivel fut a debugoland\u00f3 program, \u00edgy sokat nem tudunk vele tenni, \u00e1ll\u00edtsuk meg: break gomb a toolbaron, vagy F12.<br \/>\nA Modules ablakban l\u00e1tszanak a bet\u00f6lt\u00f6tt modulok \u00e9s a hozz\u00e1juk tartoz\u00f3 szimb\u00f3lum inf\u00f3.<br \/>\n<a href='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2007\/04\/vsmodules.jpg' title='VS 2005 Modules ablak'><img src='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2007\/04\/vsmodules.thumbnail.jpg' alt='VS 2005 Modules ablak' \/><\/a><br \/>\nA k\u00f6vetkez\u0151 l\u00e9p\u00e9s t\u00f6r\u00e9spontok be\u00e1ll\u00edt\u00e1sa. Mivel nincs forr\u00e1sk\u00f3dunk, ez kicsit macer\u00e1sabb, mint saj\u00e1t k\u00f3dokn\u00e1l, de nagyobb az \u00f6r\u00f6m is, ha siker\u00fcl \u00f6sszehozni. :)<br \/>\nPl., a diagnosztiz\u00e1land\u00f3 probl\u00e9ma miatt engem \u00e9rdekel, ha a registryb\u0151l akar egy \u00e9rt\u00e9ket olvasni az IE. Ezt valszeg a RegGetValue h\u00edv\u00e1s\u00e1val teszi meg. Rakjunk erre egy t\u00f6r\u00e9spontot!<br \/>\nA <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms724868.aspx\">doksib\u00f3l<\/a> l\u00e1tjuk, hogy a RegGetValue 7 param\u00e9teres. Ez az\u00e9rt fontos, mert az export\u00e1lt nevek kicsit meg vannak gy\u00farva, \u00edgy csak a f\u00fcggv\u00e9ny nev\u00e9vel nem lehet t\u00f6r\u00e9spontot berakni. A mangled n\u00e9v \u00edgy n\u00e9z ki \u00e1ltal\u00e1ban az api f\u00fcggv\u00e9nyekn\u00e9l (x86): _Fv@a param\u00e9terek \u00f6sszm\u00e9rete. \u00cdgy a RegGetValue neve: _RegGetValueW@28 (7&#215;4). A befagyaszott k\u00f3dban a Breakpoints ablakban, New Breakpoint-tal m\u00e1r be is rakhatjuk a t\u00f6r\u00e9spontot:<br \/>\n<a href='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2007\/04\/breakpoints.jpg' title='VS 2005 Breakpoints ablak, benne 3 t\u00f6r\u00e9sponttal'><img src='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2007\/04\/breakpoints.thumbnail.jpg' alt='VS 2005 Breakpoints ablak, benne 3 t\u00f6r\u00e9sponttal' \/><\/a><br \/>\nHa tele, piros k\u00f6rt l\u00e1tunk, \u00f6r\u00fcl\u00fcnk, ha nem, \u00fajragondoljuk a nevet.<br \/>\nEzut\u00e1n a k\u00f3dot elind\u00edtva el\u0151bb-ut\u00f3bb becsap a k\u00edv\u00e1nt t\u00f6r\u00e9spont:<br \/>\n<a href='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2007\/04\/breakpointhit.jpg' title='Becsapott a t\u00f6r\u00e9spont :)'><img src='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2007\/04\/breakpointhit.thumbnail.jpg' alt='Becsapott a t\u00f6r\u00e9spont :)' \/><\/a><br \/>\nA k\u00e9pen sokkal t\u00f6bb l\u00e1tszik, mint egyszer\u0171en a t\u00f6r\u00e9spont. A bal oldalra dokkolt Memory 1 fenti komb\u00f3j\u00e1ba be\u00edrtam, hogy ESP, \u00edgy r\u00e1\u00e1lt a veremmutat\u00f3 c\u00edm\u00e9re, azaz az ablak tetej\u00e9n a fv. h\u00edv\u00e1s lok\u00e1lis param\u00e9terei l\u00e1that\u00f3k. A legfels\u0151 \u00e9rt\u00e9k a visszat\u00e9r\u00e9si c\u00edm, a m\u00e1sik az els\u0151 param\u00e9ter, stb. Kijel\u00f6ltem a 76daa4b8 param\u00e9tert, ami a RegGetValue LPCTSTR lpValue param\u00e9tere, azaz egy string mutat\u00f3, eset\u00fcnkben Unicode, mert Vist\u00e1n vagyunk. R\u00e1dobtam a Watch ablakra, \u00e9s \u00e1tkasztoltam wchar_t*-g\u00e1, \u00edgy azonnal l\u00e1that\u00f3 lett az \u00e9rt\u00e9ke. Hasonl\u00f3 m\u00f3don a Memory 2 komb\u00f3j\u00e1ba is beledobtam az \u00e9rt\u00e9ket, \u00edgy ott is l\u00e1that\u00f3 a string.<br \/>\nBajban vagyunk a t\u00f6r\u00e9spont szintaxis\u00e1val, ha Template-et haszn\u00e1l\u00f3 oszt\u00e1lyokban kell t\u00f6r\u00e9spontot be\u00e1ll\u00edtani. Ilyenkor a fenti kukacos, sz\u00e1mol\u00f3s elj\u00e1r\u00e1s nem j\u00f6n be, nincs mese, bele kell kukkantani a pdb-be.<br \/>\nA DIA sdk-ban (a VS setup r\u00e9sze, ha k\u00e9rj\u00fck) vagy egy kis p\u00e9lda, DIA2DUMP a neve. Ezt leford\u00edtva egy pdb dumpol\u00f3 eszk\u00f6zt kapunk a kez\u00fcnkbe.<br \/>\nEngem az urlmon.dll belseje \u00e9rdekelt. A Modules ablakb\u00f3l tudom, melyik konkr\u00e9t pdb tartalmaz hozz\u00e1 inf\u00f3t. Ezut\u00e1n egyszer\u0171en a pdb k\u00f6nyvt\u00e1r\u00e1b\u00f3l:<br \/>\ndia2dump urlmon.pdb >dump.txt<br \/>\nA dump 9 mega. Az elej\u00e9b\u0151l megtudhatjuk hol voltak az obj f\u00e1jlok a MS build g\u00e9p\u00e9n, amin a Vista RTM k\u00e9sz\u00fclt:<\/p>\n<p>0001 f:\\vistartm.obj.x86fre\\shell\\lib\\cul\\objfre\\i386\\precomp.obj<br \/>\n0002 f:\\vistartm.obj.x86fre\\inetcore\\lib\\stock\\stock\\objfre\\i386\\stock.obj<br \/>\n0003 f:\\vistartm.obj.x86fre\\inetcore\\urlmon\\mon\\daytona\\objfre\\i386\\mon.obj<br \/>\n0004 f:\\vistartm.obj.x86fre\\inetcore\\urlmon\\trans\\daytona\\..\\..\\mon\\daytona\\objfre\\i386\\trans.obj<br \/>\n0005 f:\\vistartm.obj.x86fre\\inetcore\\urlmon\\iapp\\daytona\\..\\..\\mon\\daytona\\objfre\\i386\\iapp.obj<br \/>\n0006 f:\\vistartm.obj.x86fre\\inetcore\\urlmon\\download\\daytona\\objfre\\i386\\cdlpch.obj<br \/>\n0007 f:\\vistartm.obj.x86fre\\inetcore\\urlmon\\zones\\daytona\\objfre\\i386\\zonepch.obj<br \/>\n&#8230;<br \/>\n018D f:\\vistartm.obj.x86fre\\inetcore\\inetcommon\\commonparse\\objfre\\i386\\add2strw.obj<\/p>\n<p>Majd j\u00f6nnek a szimb\u00f3lumok:<br \/>\nPublicSymbol: [000a7201][000a7201][0001:000a274d] _OutputBlock@4(_OutputBlock@4)<br \/>\n&#8230;<br \/>\n\u00c9n a Call Stack ablakb\u00f3l l\u00e1ttam, hogy a Cwvt::InvokeWinVerifyTrust met\u00f3dus m\u0171k\u00f6d\u00e9se \u00e9rdekel. R\u00e1keresve a dumpban a InvokeWinVerifyTrust-ra ez a szimb\u00f3lum j\u00f6n fel:<br \/>\n?InvokeWinVerifyTrust@Cwvt@@AAEJPAXPAUHWND__@@KPAPAU_JAVA_TRUST@<br \/>\n@PBGPAUIInternetHostSecurityManager@@3PADHPAVCDownload@@@Z<br \/>\n(private: long __thiscall Cwvt::InvokeWinVerifyTrust(void *,<br \/>\nstruct HWND__ *,unsigned long,struct _JAVA_TRUST * *,<br \/>\nunsigned short const *,struct IInternetHostSecurityManager *,<br \/>\nunsigned short const *,char *,int,class CDownload *))<\/p>\n<p>Durva? Nagyon. Ez egy szimb\u00f3lum, egy sor, csak bet\u00f6rdeltem. Sajnos a template-ek miatt a compiler nagyon ronda cuccot rak \u00f6ssze, de norm\u00e1lis emberek nem is n\u00e9zegetnek ilyesmit. :)<br \/>\n\u00c1m ak\u00e1rmilyen hossz\u00fa is, a Breakpoints ablakba bepaszt\u00e1zva r\u00e1tal\u00e1l a VS \u00e9s t\u00f6r\u00e9spontra, \u00e9s meg is \u00e1ll ott.<br \/>\nSzeretn\u00e9m hangs\u00falyozni, hogy ehhez a debugol\u00e1shoz NEM haszn\u00e1ltam a forr\u00e1sk\u00f3d el\u00e9r\u00e9semet, tiszt\u00e1n a mindenki sz\u00e1m\u00e1ra el\u00e9rhet\u0151 publikus szimb\u00f3lumokkal dolgoztam. M\u00e1s k\u00e9rd\u00e9s, hogy a hiba felder\u00edt\u00e9s\u00e9hez nagyban seg\u00edt, hogy k\u00f6zben egy m\u00e1sik g\u00e9pen \u00e9s monitoron olvasom a forr\u00e1st. :)<br \/>\nHa siker\u00fclt valamit kinyomoznom a nagy debugol\u00e1ssal, elmes\u00e9lem. Ha nem, megtanultam jobban debugolni, \u00e9s ti is kaptatok \u00edzel\u00edt\u0151t bel\u0151le.<br \/>\nJa, \u00e9s a t\u00e9m\u00e1ban az alapm\u0171: <a href=\"http:\/\/www.amazon.com\/Debugging-Applications-Microsoft-NET-Windows\/dp\/0735615365\">Debugging Applications for Microsoft .NET and Microsoft Windows<\/a>. Az <a href=\"http:\/\/www.amazon.com\/Debugging-Microsoft-NET-2-0-Applications\/dp\/0735622027\">\u00faj r\u00e9sz<\/a> m\u00e1r csak manazsolt k\u00f3ddal foglalkozik, erre figyeljetek.<br \/>\nUpdate: lett eredm\u00e9nye a 3 napos debugoz\u00e1snak: az ActiveX Installer Service-szel fel se veszi a kapcsolatot az IE, ha az IE egy LUA account nev\u00e9ben fut. LUA: admin, de nem admin, azaz be van kapcsolva az UAC \u00e9s az illet\u0151 user tagja az admin csoportnak. \u00c9n ilyen voltam, \u00e9s azt hittem, hogy emiatt minden program \u00fagy kezel engem, mintha m\u00e9gse voln\u00e9k admin. Nos, az IE k\u00f3dj\u00e1ban van egy el\u00e1gaz\u00e1s, ami ez alapj\u00e1n m\u00e1sk\u00e9pp v\u00e9gzi az ActiveX telep\u00edt\u00e9st. \u00cdgy j\u00e1rtam, Zokszigen r\u00f6h\u00f6g, hogy m\u00e9g 2007-ben se vagyok igazi nonadmin, csak LUA luzer. Azt hiszem ez meggy\u0151z\u0151tt, hogy val\u00f3di nonadmink\u00e9nt kell fejlesztenem. Vagy el\u00e9g csak \u00edgy tesztelni? ;)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Szeretn\u00e9k n\u00e9mi seg\u00edts\u00e9get adni azoknak, akik nem \u00e1ltaluk \u00edrt nat\u00edv k\u00f3dot szeretn\u00e9nek debugolni. A p\u00e9ld\u00e1ban az Internet Explorert debugolom meg. A nat\u00edv&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18,4],"tags":[],"class_list":["post-232","post","type-post","status-publish","format-standard","hentry","category-debugging","category-szakmai-elet"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/232","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=232"}],"version-history":[{"count":0,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/232\/revisions"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}