{"id":2295,"date":"2021-11-23T08:08:58","date_gmt":"2021-11-23T07:08:58","guid":{"rendered":"http:\/\/soci.hu\/blog\/?p=2295"},"modified":"2021-11-25T08:15:05","modified_gmt":"2021-11-25T07:15:05","slug":"windows-atom-szivargas-nyomozasa-i","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2021\/11\/23\/windows-atom-szivargas-nyomozasa-i\/","title":{"rendered":"Windows Atom sziv\u00e1rg\u00e1s nyomoz\u00e1sa I."},"content":{"rendered":"\n<p>Egy nem h\u00e9tk\u00f6znapi hib\u00e1t mutatok most be.<\/p>\n\n\n\n<p>Ez az els\u0151 r\u00e9sze a cikknek, a m\u00e1sodik <a href=\"https:\/\/soci.hu\/blog\/index.php\/2021\/11\/25\/windows-atom-szivargas-nyomozasa-ii\/\">itt<\/a> olvashat\u00f3.<\/p>\n\n\n\n<p>A managed memory leakeket el\u00e9g k\u00f6nny\u0171 megfogni allocation profilerekkel, mint pl. a DotMemory. \u00c1ltal\u00e1ban a neh\u00e9zs\u00e9get (nekem) az okozza, hogy meg\u00e9rtsem az \u00fcgyf\u00e9l k\u00f3dj\u00e1t annyira, hogy legyen fogalmam r\u00f3la, mit tekint\u00fcnk k\u00e1rosan soknak, vagy minek szabad tart\u00f3san benn lenne mem\u00f3ri\u00e1ban, \u00e9s minek nem.<\/p>\n\n\n\n<p>A norm\u00e1l memory leak t\u00fcneti kezel\u00e9ssel gy\u00f3gy\u00edthat\u00f3, csak meg kell sz\u00fcntetni a sziv\u00e1rg\u00f3 processzt, \u00e9s m\u00e1ris visszakaptuk a feleslegesen lefoglalt mem\u00f3ri\u00e1t.<\/p>\n\n\n\n<p>A mostani sziv\u00e1rg\u00e1s viszont egy sokkal aljasabb fajta. Hi\u00e1ba l\u00f6v\u00f6d ki az inkontinens processzt, a lefoglalt er\u0151forr\u00e1sok tov\u00e1bbra is beragadnak, ki kell l\u00e9petni a felhaszn\u00e1l\u00f3t \u00e9s vissza, csak akkor kapjuk vissza az er\u0151forr\u00e1sokat.<\/p>\n\n\n\n<p>A hiba egy saj\u00e1t WPF programomban j\u00f6tt el\u0151, ami mindig vas\u00e1rnap \u00e9jf\u00e9lt\u0151l p\u00e9ntek \u00e9jf\u00e9lig fut. Van teh\u00e1t ideje sziv\u00e1rogtani, ha akar. A hibajelens\u00e9g az volt, hogy cs\u00fct\u00f6rt\u00f6k t\u00e1j\u00e1n elkezdett megd\u00f6gleni a Windows. Nem indult el az Explorer, nem j\u00f6tt be a Task Manager se. Minden program a &#8220;Not enough storage available to process this command&#8221; hib\u00e1val sz\u00e1llt el. Logoff-logon megoldotta.<\/p>\n\n\n\n<p>A processek handle countja norm\u00e1lis. A mem\u00f3ria felhaszn\u00e1l\u00e1suk norm\u00e1lis. Ez\u00e9rt norm\u00e1l eszk\u00f6z\u00f6kkel nem utal semmi a hiba forr\u00e1s\u00e1ra.<\/p>\n\n\n\n<p>A &#8220;Not enough storage available to process this command&#8221; sz\u00f6vegre keresve az <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/dataxchg\/about-atom-tables\">Atom<\/a> t\u00e1bl\u00e1kra terel\u0151dik a gyan\u00fa. Ez egy n\u00e9v-\u00e9rt\u00e9k t\u00e1rol\u00f3, ami 16 bites kulcsokat haszn\u00e1l. Ez m\u00e1r r\u00f6gt\u00f6n gyan\u00fas a mai vil\u00e1gban, sokan nem is \u00e9ltek m\u00e9g az olvas\u00f3k k\u00f6z\u00f6l, amikor 16 bites rendszerek voltak. :) DDE \u00e9s egyes Windowing f\u00fcggv\u00e9nyek haszn\u00e1lj\u00e1k. Nagyon hasonl\u00f3, mint a .NET CLR String Intern t\u00e1bl\u00e1ja.<\/p>\n\n\n\n<p>Az atom t\u00e1bl\u00e1k monitoroz\u00e1sa nem olyan egyszer\u0171, nincs r\u00e1 performance counter, debuggerb\u0151l nem l\u00e1tszik nyilv\u00e1nval\u00f3an.<\/p>\n\n\n\n<p>Szerencs\u00e9re egy koll\u00e9ga \u00edrt hozz\u00e1 egy kis <a href=\"https:\/\/github.com\/JordiCorbilla\/atom-table-monitor\">c\u00e9leszk\u00f6zt<\/a>. Ez a GetClipboardFormatName API f\u00fcggv\u00e9ny sokf\u00e9le param\u00e9terrel t\u00f6rt\u00e9n\u0151 h\u00edv\u00e1s\u00e1val v\u00e9gigkeresteti a 16 bites teljes tartom\u00e1nyt, \u00edgy l\u00e1that\u00f3v\u00e1 v\u00e1lnak, mely c\u00edmek vannak elfoglalva.<\/p>\n\n\n\n<p>A k\u00e9pen bal oldal\u00e1n l\u00e1that\u00f3k a bugos program \u00e1ltal lefoglalt atomok. Lehet regexekkel sz\u00ednezni a k\u00e9pet, a r\u00f3asz\u00edn az \u00e9n kis bugos dr\u00e1gasz\u00e1gom.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"556\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-1024x556.png\" alt=\"\" class=\"wp-image-2297\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-1024x556.png 1024w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-600x326.png 600w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-300x163.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-768x417.png 768w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-624x339.png 624w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image.png 1465w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Atomsziv\u00e1rg\u00e1s<\/figcaption><\/figure>\n\n\n\n<p>Egy nap m\u00falva m\u00e1r durv\u00e1bb a helyzet:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"569\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-1-1024x569.png\" alt=\"\" class=\"wp-image-2299\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-1-1024x569.png 1024w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-1-600x333.png 600w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-1-300x167.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-1-768x427.png 768w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-1-624x347.png 624w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-1.png 1456w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Egy nappal k\u00e9s\u0151bb<\/figcaption><\/figure>\n\n\n\n<p>A k\u00e9peken a local atom table l\u00e1tszik, a global atom table nem h\u00edzott.<\/p>\n\n\n\n<p>A le\u00edr\u00e1sok alapj\u00e1n a RegisterWindowMessage&nbsp;h\u00edv\u00e1sok pakolnak be ide t\u00e9teleket. Maguk a probl\u00e9m\u00e1s, szaporod\u00f3 atomokat ezt a sz\u00f6veget tartalmazz\u00e1k:<\/p>\n\n\n\n<p>DA13 = HwndWrapper[Trader;;0def0780-e17c-49d0-a243-149008a6b29e] &#8211;RWM<\/p>\n\n\n\n<p>Managed k\u00f3d eset\u00e9n sim\u00e1n debuggerben meg\u00e1lln\u00e1nk, amikor be akar sz\u00farni a program egy atomot. De az Atom API csak kernel m\u00f3dban debugolhat\u00f3, egy szerveren ilyet nem fogok csin\u00e1lni.<\/p>\n\n\n\n<p>Azonban a RegisterWindowMessage-et esetleg el tudom kapni. Igaz, ez se managed funkci\u00f3, de az\u00e9rt managed programb\u00f3l is ki lehet debugolni a nem managed, de user m\u00f3d\u00fa h\u00edv\u00e1sokat.<\/p>\n\n\n\n<p>De el\u0151tte az\u00e9rt sz\u00e9t szoktunk n\u00e9zni, ment\u00e1lis debuggingot alkalmazunk. A WPF forr\u00e1sk\u00f3dj\u00e1ban <a href=\"https:\/\/github.com\/dotnet\/wpf\/search?q=RegisterWindowMessage\">ezeken<\/a> a helyeken van RegisterWindowMessage hivatkoz\u00e1s.<\/p>\n\n\n\n<p>Ami az els\u0151 \u00e1br\u00e1n \u00e9rdekes, hogy vas\u00e1rnap 18 \u00f3r\u00e1ig (EST) nem volt leak, csak ut\u00e1na indul meg a jobb oldali chart felfel\u00e9. Akkor indul ugyanis a keresked\u00e9s, onnant\u00f3l \u00e9rkeznek adatok, amiket a program feldolgoz. Az adatok feldolgoz\u00e1sa m\u00e1sodpercenk\u00e9nt egyszer t\u00f6rt\u00e9nik, mert \u00edgy adja az adatokat az adatforr\u00e1s. Mivel az adatokat h\u00e1tt\u00e9rsz\u00e1lon \u00e9rkeznek, ez\u00e9rt a GUI r\u00e9sz\u00e9re \u00e1t kell dispatch-elni a h\u00edv\u00e1sokat a f\u0151sz\u00e1lra. Val\u00f3sz\u00edn\u0171leg ehhez a WPF valamilyen Windows Window mechanizmust haszn\u00e1l, teh\u00e1t \u00e9rz\u00e9sre ezen a k\u00f6rny\u00e9ken lesz a probl\u00e9ma forr\u00e1sa.<\/p>\n\n\n\n<p>Logikus lenne a forr\u00e1sk\u00f3d v\u00e1ltoz\u00e1sait visszan\u00e9zni a m\u00faltban, \u00e9s megn\u00e9zni, mi v\u00e1ltozott benne, ami kiv\u00e1ltotta a hib\u00e1t. A neh\u00e9zs\u00e9g az, hogy a beteg program \u00e1ltal\u00e1ban egy p\u00e9ld\u00e1nyban fut csak, \u00e9s akkor ki\u00edrja egy h\u00e9tig a Windows, nem telik be az atom t\u00e1bla. De mostan\u00e1ban k\u00e9t p\u00e9ld\u00e1nyban futtatom, ez\u00e9rt j\u00f6tt el\u0151 a hiba. \u00cdgy viszont nem tudom, melyik verzi\u00f3val j\u00f6tt be. (Vissza\u00e1llni meg \u00fczleti okok miatt nem lehet).<\/p>\n\n\n\n<p>Azon az \u00faton azonban el lehet indulni, hogy vagy a GUI r\u00e9szen t\u00f6rt\u00e9nt valami m\u00f3dos\u00edt\u00e1s, ahol a h\u00e1tt\u00e9rsz\u00e1las adatokat veszem ki, vagy az adatforr\u00e1sn\u00e1l.<\/p>\n\n\n\n<p>Az adatforr\u00e1sban egy ilyen kis v\u00e1ltoztat\u00e1s volt szeptember v\u00e9g\u00e9n:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"34\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-2-1024x34.png\" alt=\"\" class=\"wp-image-2301\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-2-1024x34.png 1024w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-2-600x20.png 600w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-2-300x10.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-2-768x25.png 768w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-2-624x21.png 624w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-2.png 1487w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Ha m\u00e1r \u00fagyis async volt a k\u00fcls\u0151 met\u00f3dus, akkor egy szinkron h\u00edv\u00e1st is kicser\u00e9ltem asyncre, hogy sz\u00e9p legyen. Lehet hogy ez okozza a probl\u00e9m\u00e1t? Hamarosan kider\u00fcl.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Egy nem h\u00e9tk\u00f6znapi hib\u00e1t mutatok most be. Ez az els\u0151 r\u00e9sze a cikknek, a m\u00e1sodik itt olvashat\u00f3. A managed memory leakeket el\u00e9g&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[102,104],"class_list":["post-2295","post","type-post","status-publish","format-standard","hentry","category-szakmai-elet","tag-atom","tag-debuggin"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2295","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=2295"}],"version-history":[{"count":5,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2295\/revisions"}],"predecessor-version":[{"id":2330,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2295\/revisions\/2330"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=2295"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=2295"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=2295"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}