{"id":2304,"date":"2021-11-25T08:13:23","date_gmt":"2021-11-25T07:13:23","guid":{"rendered":"http:\/\/soci.hu\/blog\/?p=2304"},"modified":"2021-11-25T08:26:48","modified_gmt":"2021-11-25T07:26:48","slug":"windows-atom-szivargas-nyomozasa-ii","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2021\/11\/25\/windows-atom-szivargas-nyomozasa-ii\/","title":{"rendered":"Windows Atom sziv\u00e1rg\u00e1s nyomoz\u00e1sa II."},"content":{"rendered":"\n<p>Az els\u0151 <a href=\"https:\/\/soci.hu\/blog\/index.php\/2021\/11\/23\/windows-atom-szivargas-nyomozasa-i\/\">r\u00e9szben<\/a> od\u00e1ig jutottunk el, hogy val\u00f3sz\u00edn\u0171leg egy RegisterWindowMessage API h\u00edv\u00e1s helyezi el az Atomot a Windows Atom t\u00e1rol\u00f3j\u00e1ban.<\/p>\n\n\n\n<p>A google seg\u00edtett r\u00e1mutatni, hogy (t\u00f6bbek k\u00f6z\u00f6tt) a HwndWrapper t\u00edpus h\u00edvja. A <a href=\"https:\/\/github.com\/dotnet\/wpf\/blob\/89d172db0b7a192de720c6cfba5e28a1e7d46123\/src\/Microsoft.DotNet.Wpf\/src\/Shared\/MS\/Win32\/HwndWrapper.cs\">forr\u00e1sban<\/a> itt az idev\u00e1g\u00f3 r\u00e9sz:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"538\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-8-1024x538.png\" alt=\"\" class=\"wp-image-2313\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-8-1024x538.png 1024w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-8-600x315.png 600w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-8-300x158.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-8-768x403.png 768w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-8-624x328.png 624w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-8.png 1047w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>HwndWrapper konstruktor<\/figcaption><\/figure>\n\n\n\n<p>Szinte biztos, hogy meg\u00e9rkezt\u00fcnk a hib\u00e1t okoz\u00f3 r\u00e9szhez, mert ilyen atomokkal van tele az atomt\u00e1rol\u00f3:<\/p>\n\n\n\n<p>DA13 = HwndWrapper[Trader;;0def0780-e17c-49d0-a243-149008a6b29e]<\/p>\n\n\n\n<p>Elj\u00f6tt az ideje, hogy bepiszkoljuk a kez\u00fcnket. A c\u00e9l debuggerben elkapni a HwndWrapper konstruktor\u00e1t h\u00edv\u00f3 k\u00f3dot. Ha a stack trace-ben felismerj\u00fck a saj\u00e1t k\u00f3dunkat, akkor tudjuk, melyik sorunk v\u00e1ltotta ki a hib\u00e1t.<\/p>\n\n\n\n<p>El\u0151vessz\u00fck a WinDebugot, \u00e9s hozz\u00e1attacsolunk a sziv\u00e1rogtat\u00f3 processzhez.<\/p>\n\n\n\n<p>A HwndWrapper konstuktor\u00e1t h\u00edv\u00f3 k\u00f3dot akarjuk megfogni. De ez a met\u00f3dus m\u00e1r r\u00e9g le van jittelve, ez\u00e9rt el\u0151 kell keresni a mem\u00f3riabeli c\u00edm\u00e9t.<\/p>\n\n\n\n<p>Lek\u00e9rj\u00fck az oszt\u00e1ly met\u00f3dus t\u00e1bl\u00e1j\u00e1t:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"426\" height=\"114\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-4.png\" alt=\"\" class=\"wp-image-2307\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-4.png 426w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-4-300x80.png 300w\" sizes=\"auto, (max-width: 426px) 100vw, 426px\" \/><\/figure>\n\n\n\n<p>Kidumpoltatjuk a met\u00f3dusokat le\u00edr\u00f3 t\u00e1bl\u00e1zatot:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"404\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-5-1024x404.png\" alt=\"\" class=\"wp-image-2308\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-5-1024x404.png 1024w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-5-600x237.png 600w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-5-300x118.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-5-768x303.png 768w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-5-624x246.png 624w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-5.png 1346w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Lek\u00e9rj\u00fck a k\u00edv\u00e1nt met\u00f3dus (konstruktor) r\u00e9szletes adatait:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"222\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-6-1024x222.png\" alt=\"\" class=\"wp-image-2309\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-6-1024x222.png 1024w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-6-600x130.png 600w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-6-300x65.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-6-768x167.png 768w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-6-624x135.png 624w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-6.png 1189w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Most, hogy m\u00e1r tudjuk, hogy lakik a mem\u00f3ri\u00e1ban, be\u00e1ll\u00edtunk r\u00e1 egy t\u00f6r\u00e9spontot:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"214\" height=\"21\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-7.png\" alt=\"\" class=\"wp-image-2310\"\/><\/figure>\n\n\n\n<p>V\u00e1runk p\u00e1r m\u00e1sodpercet, \u00e9s be\u00e1ll a debugger a t\u00f6r\u00e9spontba. !ClrStack paranccsal (ez m\u00e1r sos managed parancs, nem nat\u00edv, mint az eddigiek) megn\u00e9zz\u00fck a sz\u00e1lakat. A mi k\u00e9rd\u00e9ses sz\u00e1lunk stack trace-e \u00edgy n\u00e9z ki:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-3-1024x357.png\" alt=\"\" class=\"wp-image-2306\" width=\"1063\" height=\"370\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-3-1024x357.png 1024w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-3-600x209.png 600w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-3-300x105.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-3-768x268.png 768w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-3-1536x536.png 1536w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-3-624x218.png 624w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-3.png 1839w\" sizes=\"auto, (max-width: 1063px) 100vw, 1063px\" \/><figcaption>A probl\u00e9m\u00e1t okoz\u00f3 stack trace<\/figcaption><\/figure>\n\n\n\n<p>Mit l\u00e1tunk itt? (Lehet semmit, mert \u00f6sszenyomja a k\u00e9pet a wordpress. Kirakom sz\u00f6vegk\u00e9nt is.)<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nCurrent frame: (MethodDesc 00007ffaddf27698 + 0 MS.Win32.HwndWrapper..ctor(Int32, Int32, Int32, Int32, Int32, Int32, Int32, System.String, IntPtr, MS.Win32.HwndWrapperHook&#x5B;]))\nChild-SP         RetAddr          Caller, Callee\n00000044D153C8A0 00007ffae15d6bb6 (MethodDesc 00007ffaddf0ce98 + 0x266 System.Windows.Threading.Dispatcher..ctor()), calling (MethodDesc 00007ffaddf27698 + 0 MS.Win32.HwndWrapper..ctor(Int32, Int32, Int32, Int32, Int32, Int32, Int32, System.String, IntPtr, MS.Win32.HwndWrapperHook&#x5B;]))\n00000044D153C8C0 00007ffae02cecf9 (MethodDesc 00007ffae00679c0 + 0x59 ATS.Core.Utils.NumberExtensions.LoseEqual(Double, Double)), calling coreclr!JIT_GetSharedNonGCStaticBase_SingleAppDomain &#x5B;D:\\workspace\\_work\\1\\s\\src\\coreclr\\src\\vm\\amd64\\JitHelpers_SingleAppDomain.asm:25]\n00000044D153C940 00007ffadf88eafe (MethodDesc 00007ffaddf0c720 + 0x4e System.Windows.Threading.Dispatcher.get_CurrentDispatcher()), calling (MethodDesc 00007ffaddf0ce98 + 0 System.Windows.Threading.Dispatcher..ctor())\n00000044D153C960 00007ffae151201e (MethodDesc 00007ffadef6a9b0 + 0x3e System.Windows.Input.CommandManager.get_Current()), calling coreclr!JIT_WriteBarrier &#x5B;D:\\workspace\\_work\\1\\s\\src\\coreclr\\src\\vm\\amd64\\JitHelpers_Fast.asm:97]\n00000044D153C970 00007ffae1512056 (MethodDesc 00007ffadef6ab28 + 0x16 System.Windows.Input.CommandManager.RaiseRequerySuggested()), calling (MethodDesc 00007ffaddf0c720 + 0 System.Windows.Threading.Dispatcher.get_CurrentDispatcher())\n00000044D153C990 00007ffae15121c9 (MethodDesc 00007ffadef6a998 + 0x9 System.Windows.Input.CommandManager.InvalidateRequerySuggested()), calling (MethodDesc 00007ffadef6a9b0 + 0 System.Windows.Input.CommandManager.get_Current())\n00000044D153C9C0 00007ffadf9223c8 (MethodDesc 00007ffadf00a448 + 0x28 ATS.RelayCommand.RaiseCanExecuteChanged()), calling (MethodDesc 00007ffadef6a998 + 0 System.Windows.Input.CommandManager.InvalidateRequerySuggested())\n00000044D153C9F0 00007ffae150c44e (MethodDesc 00007ffae1760db0 + 0xee ATS.TaInfo+&amp;lt;OneMinuteUpdates&gt;d__197.MoveNext()), calling (MethodDesc 00007ffadf00a448 + 0 ATS.RelayCommand.RaiseCanExecuteChanged())\n00000044D153CA00 00007ffae150d4a4 (MethodDesc 00007ffae0564348 + 0x234 ATS.CommonConcepts.TaBase`1&#x5B;&#x5B;System.__Canon, System.Private.CoreLib]].TryToEnter(ATS.BarEx))\n00000044D153CBC0 00007ffae0edc2ab (MethodDesc 00007ffadfc50b60 + 0x6b System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start&#x5B;&#x5B;System.__Canon, System.Private.CoreLib]](System.__Canon ByRef))\n00000044D153CBF0 00007ffae150c33b (MethodDesc 00007ffae1760da0 + 0x2b ATS.TaInfo+&amp;lt;OneMinuteUpdates&gt;d__197..ctor()), calling (MethodDesc 00007ffaddac0be8 + 0 System.Object..ctor())\n00000044D153CC20 00007ffae150c2cb (MethodDesc 00007ffadfbe0cc8 + 0x10b ATS.TaInfo.OneMinuteUpdates(ATS.ITradingAlgorithm, ATS.BarCollection, ATS.BarCollection, ATS.BarEx)), calling (MethodDesc 00007ffadfc50938 + 0 System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start&#x5B;&#x5B;System.__Canon, System.Private.CoreLib]](System.__Canon ByRef))\n00000044D153CC40 00007ffae150a6af (MethodDesc 00007ffae0562f80 + 0x12f ATS.TA`1&#x5B;&#x5B;System.__Canon, System.Private.CoreLib]].StepOne(ATS.BarEx, Boolean, ATS.BarProperty))\n00000044D153CC90 00007ffae150c19b (MethodDesc 00007ffae11827a8 + 0x5b ATS.TaInfo+&amp;lt;&gt;c__DisplayClass196_0.&amp;lt;WhenBarsReady&gt;b__4(ATS.BarEx)), calling (MethodDesc 00007ffadfbe0cc8 + 0 ATS.TaInfo.OneMinuteUpdates(ATS.ITradingAlgorithm, ATS.BarCollection, ATS.BarCollection, ATS.BarEx))\n00000044D153CCD0 00007ffae0f432b1 (MethodDesc 00007ffae1183ac0 + 0x71 ILStubClass.IL_STUB_MulticastDelegate_Invoke(ATS.BarEx))\n00000044D153CD10 00007ffae150a4e7 (MethodDesc 00007ffade4d81f0 + 0x87 ATS.BarCollection.RaiseDelayedOnBarAdded())\n00000044D153CD60 00007ffae150a441 (MethodDesc 00007ffade4cef70 + 0x41 ATS.BarFromTickFactory.RaiseDelayedOnBarAdded()), calling (MethodDesc 00007ffade4d81f0 + 0 ATS.BarCollection.RaiseDelayedOnBarAdded())\n00000044D153CDA0 00007ffae150a394 (MethodDesc 00007ffae0562f30 + 0xa4 ATS.TA`1&#x5B;&#x5B;System.__Canon, System.Private.CoreLib]].TsOnTickArrivedPost(ATS.Core.TickData.TickOhlc)), calling (MethodDesc 00007ffade4cef70 + 0 ATS.BarFromTickFactory.RaiseDelayedOnBarAdded())\n00000044D153CDB0 00007ffadfede055 (MethodDesc 00007ffade3ee688 + 0x45 log4net.Repository.Hierarchy.Logger.IsEnabledFor(log4net.Core.Level))\n00000044D153CE00 00007ffae14fceba (MethodDesc 00007ffade4d7118 + 0x9a ATS.SteamingTickSourceBase.OnTickArrivedPost(ATS.Core.TickData.TickOhlc))\n00000044D153CE70 00007ffae1599853 (MethodDesc 00007ffade608348 + 0x103 ATS.Basics.LiveTrading.CombinedBackFilledTickDataSource.OnTickArrivedFilteredForRealtimeTicks(ATS.Core.TickData.TickOhlc)), calling (MethodDesc 00007ffade4d7118 + 0 ATS.SteamingTickSourceBase.OnTickArrivedPost(ATS.Core.TickData.TickOhlc))\n00000044D153CF50 00007ffae14fcac8 (MethodDesc 00007ffade6082e8 + 0x568 ATS.Basics.LiveTrading.CombinedBackFilledTickDataSource.RealTimeDataSourceTickArrived(ATS.Core.TickData.TickOhlc)), calling (MethodDesc 00007ffade608348 + 0 ATS.Basics.LiveTrading.CombinedBackFilledTickDataSource.OnTickArrivedFilteredForRealtimeTicks(ATS.Core.TickData.TickOhlc))\n00000044D153D180 00007ffae1027f8a (MethodDesc 00007ffade4d7100 + 0x9a ATS.SteamingTickSourceBase.OnTickArrived(ATS.Core.TickData.TickOhlc))\n00000044D153D1F0 00007ffae10280bd (MethodDesc 00007ffade526628 + 0x10d ATS.TimeAggregatingStreamingTickSourceDecorator.TickSourceOnTickArrived(ATS.Core.TickData.TickOhlc)), calling (MethodDesc 00007ffade4d7100 + 0 ATS.SteamingTickSourceBase.OnTickArrived(ATS.Core.TickData.TickOhlc))\n00000044D153D2F0 00007ffae10475a7 (MethodDesc 00007ffae14583f0 + 0x97 ILStubClass.IL_STUB_MulticastDelegate_Invoke(ATS.Core.TickData.TickOhlc))\n00000044D153D360 00007ffae1027f8a (MethodDesc 00007ffade4d7100 + 0x9a ATS.SteamingTickSourceBase.OnTickArrived(ATS.Core.TickData.TickOhlc))\n00000044D153D3D0 00007ffae102710e (MethodDesc 00007ffade54dff8 + 0x14e ATS.Basics.TradeStationApi.TradeStationSingleTickerRealtimeTickSource.BarStreamerOnBarArrived(ATS.Basics.TradeStationApi.TradeStationSteamingBar)), calling (MethodDesc 00007ffade4d7100 + 0 ATS.SteamingTickSourceBase.OnTickArrived(ATS.Core.TickData.TickOhlc))\n00000044D153D490 00007ffae1026fa2 (MethodDesc 00007ffade54b400 + 0x72 ATS.Basics.TradeStationApi.BarStreamerRealtime.OnBarArrived(ATS.Basics.TradeStationApi.TradeStationSteamingBar))\n00000044D153D4E0 00007ffae1009534 (MethodDesc 00007ffade54b3c0 + 0x9b4 ATS.Basics.TradeStationApi.BarStreamerRealtime.ProcessBar())\n00000044D153D7F0 00007ffae0fee1e1 (MethodDesc 00007ffae13f1b20 + 0x1021 ATS.Basics.TradeStationApi.BarStreamer+&amp;lt;&gt;c__DisplayClass55_0+&amp;lt;&amp;lt;StartStreamingAsync&gt;b__0&gt;d.MoveNext())\n00000044D153DE10 00007ffadf8ec8ac (MethodDesc 00007ffade0f31d0 + 0x8c System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object))\n<\/pre><\/div>\n\n\n<p>A HwndWrapper konstruktora h\u00edvja a RegisterWindowMessage-t. A HwndWrappert a Dispatcher konstruktora h\u00edvja. A Dispatchert egy hosszabb h\u00edv\u00e1si l\u00e1ncon kereszt\u00fcl a saj\u00e1t TaInfo.OneMinuteUpdates met\u00f3dusom h\u00edvja meg. Ennek az a c\u00e9lja, hogy percenk\u00e9nt friss\u00edtsen bizonyos elemeket a GUI-n. M\u00e9g tov\u00e1bb visszafel\u00e9 haladva a TradeStationApi.BarStreamer met\u00f3dusaib\u00f3l j\u00f6n a h\u00edv\u00e1s. <\/p>\n\n\n\n<p><strong>Ezek viszont h\u00e1tt\u00e9rsz\u00e1lon m\u0171k\u00f6dnek!<\/strong><\/p>\n\n\n\n<p>Ami j\u00f3 h\u00edr, hogy l\u00e1ttuk, a hiba csak akkor indul be, amikor j\u00f6n adat, ez\u00e9rt m\u00e9g er\u0151sebb a gyan\u00fa, hogy megvan a probl\u00e9ma kiv\u00e1lt\u00f3 r\u00e9sze. Ez pedig az adatforr\u00e1sunk!<\/p>\n\n\n\n<p>Az el\u0151z\u0151 r\u00e9sz v\u00e9g\u00e9n mutattam, hogy van egy gyan\u00fas v\u00e1ltoztat\u00e1s, ami ezt a hib\u00e1t behozta:<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-2-1024x34.png\" alt=\"\" width=\"1090\" height=\"35\"\/><figcaption>\u00c1rtatlannak t\u0171n\u0151 sync-async refactoring<\/figcaption><\/figure>\n\n\n\n<p>\u00cdgy n\u00e9z ki a gyan\u00fas\u00edtott k\u00f3dr\u00e9szlet:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-9-1024x432.png\" alt=\"\" class=\"wp-image-2319\" width=\"1069\" height=\"451\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-9-1024x432.png 1024w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-9-600x253.png 600w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-9-300x127.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-9-768x324.png 768w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-9-624x263.png 624w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-9.png 1163w\" sizes=\"auto, (max-width: 1069px) 100vw, 1069px\" \/><\/figure>\n\n\n\n<p>L\u00e1tszik, hogy a k\u00f3d elve egy Task.Run-ban van, egy h\u00e1tt\u00e9rsz\u00e1lon (threadpool sz\u00e1lon) fut. Az eredeti k\u00f3dban itt egy szinkron ReadLine() volt. Ezut\u00e1n a sor ut\u00e1n van a bej\u00f6v\u0151 adat feldolgoz\u00e1sa, majd a k\u00f3d felemel egy esem\u00e9nyt, az fut be a kor\u00e1bban l\u00e1tott OneMinuteUpdates met\u00f3dusba, ami azt\u00e1n kiv\u00e1ltja a leakes k\u00f3d fut\u00e1s\u00e1t.<\/p>\n\n\n\n<p>De a szinkron k\u00f3d is h\u00e1tt\u00e9rsz\u00e1lon h\u00edvott \u00e1t, m\u00e9gse volt bel\u0151le leak. Mi\u00e9rt? El\u0151sz\u00f6r is fontos lesz\u00f6gezni, hogy az a t\u00e9ny, hogy a h\u00e1tt\u00e9rsz\u00e1l GUI-t piszk\u00e1l, az bug. Csak \u00e9pp nem esett sz\u00e9t t\u0151le semmi, ez\u00e9rt \u00e9szrev\u00e9tlen maradt.<\/p>\n\n\n\n<p>Hogy hat\u00e1rozottan l\u00e1ssuk, mi t\u00f6rt\u00e9nik, id\u00e9zz\u00fck el\u0151 a hib\u00e1t \u00fajra, de most Visual Studio debuggerben. Most m\u00e1r csak managed k\u00f3dot kell debugolnunk, az \u00e9rdekel minket, milyen sz\u00e1lon \u00e9rkezik be a h\u00edv\u00e1s a OneMinuteUpdates met\u00f3dusba, mivel ez volt a legk\u00f6zelebb a t\u0171zh\u00f6z.<\/p>\n\n\n\n<p>Ez a kis k\u00f3d az, ami beleh\u00edv a WPF-be, hogy k\u00e9rje meg a GUI-n lev\u0151 gombot, hogy az k\u00e9rdezze meg t\u0151l\u00fcnk, hogy akt\u00edv lehet-e?<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"83\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-10.png\" alt=\"\" class=\"wp-image-2320\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-10.png 400w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-10-300x62.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><figcaption>Interakci\u00f3 a WPF-fel<\/figcaption><\/figure>\n\n\n\n<p>A stack trace-ben vil\u00e1gosan l\u00e1tszik, hogy ezen kereszt\u00fcl indul el a baj. De nem ez a k\u00f3d a b\u0171n\u00f6s, hanem az, aki h\u00edvja.<\/p>\n\n\n\n<p>Egy h\u00edv\u00e1s lenyomata:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"304\" height=\"413\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-11.png\" alt=\"\" class=\"wp-image-2322\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-11.png 304w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-11-221x300.png 221w\" sizes=\"auto, (max-width: 304px) 100vw, 304px\" \/><\/figure>\n\n\n\n<p>A 14308-as sz\u00e1l h\u00edv be, NEM gui thread.<\/p>\n\n\n\n<p>A k\u00f6vetkez\u0151 h\u00edv\u00e1s m\u00e1r m\u00e1sik sz\u00e1lon esik be:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"293\" height=\"330\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-12.png\" alt=\"\" class=\"wp-image-2323\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-12.png 293w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-12-266x300.png 266w\" sizes=\"auto, (max-width: 293px) 100vw, 293px\" \/><\/figure>\n\n\n\n<p>Minden egyes percben egy random threadpool sz\u00e1l visszah\u00edv egy olyan k\u00f3dot, amit csak a f\u0151sz\u00e1lb\u00f3l szabadna h\u00edvni. De mi\u00e9rt nem volt hiba a szinkron k\u00f3d eset\u00e9n?<\/p>\n\n\n\n<p>Vissza\u00edrtam a k\u00f3dot szinkronra:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"491\" height=\"69\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-13.png\" alt=\"\" class=\"wp-image-2324\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-13.png 491w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-13-300x42.png 300w\" sizes=\"auto, (max-width: 491px) 100vw, 491px\" \/><\/figure>\n\n\n\n<p>Beesik \u00fajra az event:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"293\" height=\"200\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-14.png\" alt=\"\" class=\"wp-image-2325\"\/><\/figure>\n\n\n\n<p>Azonban van egy nagyon fontos k\u00fcl\u00f6nbs\u00e9g az async k\u00f3dhoz k\u00e9pest: minden egyes visszah\u00edv\u00e1s ugyanazon a sz\u00e1lon j\u00f6n be! Nem GUI sz\u00e1l, bugos, de akkor is egyetlen, fix sz\u00e1l. Ha nincs egy sz\u00e1lhoz Dispatcher, akkor a WPF l\u00e9trehoz hozz\u00e1 egyet. De, ha mi megviccelj\u00fck, \u00e9s \u00e1lland\u00f3an \u00faj sz\u00e1lr\u00f3l k\u00e9nyszer\u00edtj\u00fck ezt ki, akkor sorban j\u00f6nnek l\u00e9tre a Dispatcherek, \u00e9s \u00edgy az atom leak.<\/p>\n\n\n\n<p>Mi\u00e9rt megy egy sz\u00e1lon a szinkron k\u00f3d, \u00e9s t\u00f6bb\u00f6n az aszinkron? Az\u00e9rt, mert async eset\u00e9n a continuation, azaz az await ut\u00e1ni k\u00f3d egy threadpool sz\u00e1lon ker\u00fcl visszah\u00edv\u00e1sra. Ha a h\u00edv\u00f3 GUI sz\u00e1l lett volna, akkor vissza dispatch-elt\u00e9k volna a h\u00edv\u00e1st a f\u0151sz\u00e1lra, de itt m\u00e1r eleve az async h\u00edv\u00f3 is h\u00e1tt\u00e9rsz\u00e1l\u00fa volt, ez\u00e9rt a continuation threadpool sz\u00e1lr\u00f3l h\u00edv\u00f3dott vissza.<\/p>\n\n\n\n<p>Mi a megold\u00e1s? Visszat\u00e9rj\u00fcnk a szinkron verzi\u00f3ra? Semmik\u00e9ppen, ez csak t\u00fcneti kezel\u00e9s lenne. Ki kell jav\u00edtani az eredeti bugot, azaz, ne ny\u00faljunk a WPF-hez h\u00e1tt\u00e9rsz\u00e1lb\u00f3l. Ehhez \u00e1t kell dobni a h\u00edv\u00e1st a f\u0151sz\u00e1lra. \u00c9n az al\u00e1bbi k\u00f3d k\u00f3dot szoktam erre haszn\u00e1lni:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"899\" height=\"288\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-15.png\" alt=\"\" class=\"wp-image-2327\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-15.png 899w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-15-600x192.png 600w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-15-300x96.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-15-768x246.png 768w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-15-624x200.png 624w\" sizes=\"auto, (max-width: 899px) 100vw, 899px\" \/><figcaption>Feladat bek\u00fcld\u00e9se a f\u0151sz\u00e1lra<\/figcaption><\/figure>\n\n\n\n<p>Amikor elindul a program, \u00e9s m\u00e1r van GUI, akkor let\u00e1rolom a f\u0151sz\u00e1l szinkroniz\u00e1ci\u00f3s contextj\u00e9t egy statikus propertyben. Ha \u00e1t kell dobni egy h\u00edv\u00e1st, akkor ennek a Post met\u00f3dus\u00e1val teszem meg.<\/p>\n\n\n\n<p>\u00cdgy \u00e1t\u00edrva a k\u00f3dot a GUI-t el\u00e9r\u0151 k\u00f3d m\u00e1r helyesen a f\u0151sz\u00e1lon fut le:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"291\" height=\"160\" src=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2021\/11\/image-16.png\" alt=\"\" class=\"wp-image-2328\"\/><\/figure>\n\n\n\n<p>Mi a tanuls\u00e1g az eg\u00e9sz nyomoz\u00e1sb\u00f3l?<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Marh\u00e1ra oda kell figyelni, hogy mindig csak a f\u0151sz\u00e1lb\u00f3l ny\u00faljunk a GUI-hoz.<\/li><li>Egy apr\u00f3 async \u00e1t\u00edr\u00e1s kilom\u00e9terekkel arr\u00e9bb komoly k\u00e1rokat okozhat.<\/li><\/ol>\n\n\n\n<p>Ut\u00f3sz\u00f3<\/p>\n\n\n\n<p>A munk\u00e1m sor\u00e1n nagyon sokat nyomozok az \u00fcgyfeleimnek hasonl\u00f3, \u00e9s m\u00e9g sokkal aljasabb probl\u00e9m\u00e1kat is, de sajnos ezeket nincs jogom le\u00edrni. De gondolkodom rajta, hogy legal\u00e1bb a tanuls\u00e1gokat m\u00e9gis valahogy meg\u00f6r\u00f6k\u00edtsem.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Az els\u0151 r\u00e9szben od\u00e1ig jutottunk el, hogy val\u00f3sz\u00edn\u0171leg egy RegisterWindowMessage API h\u00edv\u00e1s helyezi el az Atomot a Windows Atom t\u00e1rol\u00f3j\u00e1ban. A google&#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":[],"class_list":["post-2304","post","type-post","status-publish","format-standard","hentry","category-szakmai-elet"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2304","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=2304"}],"version-history":[{"count":14,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2304\/revisions"}],"predecessor-version":[{"id":2333,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/2304\/revisions\/2333"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=2304"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=2304"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=2304"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}