Category Archives: Development

Azure Web Apps: Získání memory-dumpu procesu (Web, WebJob)

Pro hlubší diagnostiku je někdy potřeba získat memory-dump procesu. Ukážeme si teď, že to jde i z Azure Web Apps (WebSites), včetně jejich WebJobs.

Kudu Process Explorer

Nejjednodušší situaci máme, pokud chceme získat aktuální memory-dump 64-bitového procesu. Stačí otevřít management-site Kudu (to je ten webík, který najdete na adrese https://yoursitename.scm.azurewebsites.net), v Process Exploreru pravým tlačítkem myši otevřít kontextové menu příslušného procesu (kromě w3wp.exe jsou tam i WebJoby) a z něj vybrat Download Memory Dump:

image

…memory-dump se začne po chvilce (někdy i po několika minutách!) stahovat.

Kudu Debugging Console + ProcMon ze SysInternals

Nejobvyklejší komplikací je, pokud nám na 64-bitovém stroji (App Service Plan) běží 32-bitový proces (což je pro Azure Web Apps poměrně obvyklé, chceme šetřit vzácnou pamětí). Výše popsaný postup přes Process Explorer nám vytvoří 64-bitový dump 32-bitového procesu, s kterým mnoho muziky nenaděláte, byť třeba Visual Studio si s ním celkem poradí (stejný problém, jako když použijete pro vytvoření dumpu 64-bitový TaskManager).

Naštěstí Kudu má kromě Process Exploreru i Debug Console – CMD i PowerShell. Navíc v cestě D:\devtools\sysinternals\ najdete na WebApps stroji předinstalované utility SysInternals vč. ProcDump (dříve bývalo potřeba ProcDump stáhnout, ale už ani to není potřeba).

image

Je zde opět jedna záludnost. ProcDump je potřeba spouštět s přepínačem -accepteula, protože jinak se při svém prvním spuštění dožaduje akceptace EULA v GUI (což nevidíte), a dokud licenční smlouvu neakceptujete, otravuje s tím stále (což se v konzoli projevuje tím, že ProcDump nic nedělá).

ProcDump lze samozřejmě použít kromě prostého získání aktuálního dumpu i v mnoha pokročilejších scénářích – obdobně jako DebugDiag mu lze říci podmínky, na jejich splnění má čekat a dump vytvořit. Viz ProcDump reference.

.NET Memory Internals & Advanced Debugging – záznam, dema a slides [WUG Brno 05/2016]

Slides a dema z mé přednášky pro WUG Brno z 31.5.2016:

Záznam z přednášky je publikován na našem HAVIT YouTube Channel.

Dotčená témata

  • StackOverflow troubleshooting
  • Stack
  • Windows Debugger, SOS, DebugDiag
  • Heap
  • Garbage Collector
  • Prozkoumávání haldy, rootů, finalization queue
  • GC Root identification (static fields)
  • Debugging dema

ASP.NET Performance Tuning – záznam, slides a dema [TechEd 05/2016]

5lides a dema z mé přednášky pro TechEd DevCon Praha ze 19.5.2016:

Záznam z přednášky je publikován na našem HAVIT YouTube Channel.

Dotčená témata

  • ASP.NET Sessions, tinyget.exe
  • PerfView
  • ANTS Performance Profiler
  • String Concatenation – skládání řetězců vs. StringBuilder
  • vyhledávání List<T>, Dictionary<TKey, TValue>, ToLookup(), BinnarySearch()
  • Reflection, dynamic
  • SQL Server Database Management Views [DMV]
  • ASP.NET Data Caching (demo ASP.NET Core)
  • ASP.NET Output Caching (demo ASP.NET Core)

ASP.NET Core MVC6 – TagHelpers, ViewComponents – záznam, dema a slides [TechEd 05/2016]

5lides a dema z mé přednášky pro TechEd DevCon Praha ze 18.5.2016:

Záznam z přednášky je publikován na našem HAVIT YouTube Channel.

Dotčená témata

  • ASP.NET Core MVC6
  • TagHelpers základy
  • TagHelpers připravené v MVC6
  • tvorba vlastních TagHelpers
  • ViewComponents základy
  • tvorba vlastních ViewComponents

ASP.NET Core – Dependency Injection & Unit-testing – záznam, slides a dema [TechEd 05/2016]

5lides a dema z mé přednášky pro TechEd DevCon Praha ze 17.5.2016:

Záznam z přednášky je publikován na našem HAVIT YouTube Channel.

Dotčená témata

  • ASP.NET Core
  • Dependency Injection základy
  • Startup.cs – ConfigureServices + environment specific
  • Controller – constructor injection
  • View – property injection
  • Unit-testing v ASP.NET Core
  • Mocking
  • Moq

Advanced Debugging Stories .NET – záznam, dema a slides [WUG Praha 4/2016]

Slides a dema z mé přednášky pro setkání WUG Praha z 12.4.2016:

Záznam z přednášky je publikován na našem HAVIT YouTube Channel.

Dotčená témata a nástroje

  • Windows Debugger + SOS.dll extension
  • Memory Dump Analysis, Crash Dump Analysis
  • DebugDiag, ClrProfiler
  • Microsoft Diagnostics Runtime
  • Stack analysis
  • Heap analysis, Garbage Collection, Finalization
  • StackOverflow

Fiddler: Zachytávání WCF SOAP volání localhost služby

Pokud ladíte projekt s WCF client-server komunikací (WCF SOAP), může se hodit možnost zachytávat tuto komunikaci ve Fiddleru.

Mnoho návodů vám pomůže nastavit Fiddlera jako proxy, pokud chcete zachytávat komunikaci svého WCF clienta se vzdálenou webovou službou. Pokud však serverovou stranu sami vyvíjíte a běží vám právě na localhost, postup dle těchto návodů vám komunikaci nezachytí.

Je potřeba na straně WCF clienta nastavit adresu cílových endpointů pomocí “localhost.fiddler:port”, všude tam, kde dosud máte “localhost”:

<system.serviceModel>
    <client>
        <endpoint address="http://localhost.fiddler:12890/WebServices/MyService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyService" contract="MyApp.IMyService" name="BasicHttpBinding_IMyService"/>
    </client>
</system.serviceModel>

Fiddler: Ignorování requestů (šumu na pozadí)

Kde jsou ty časy, kdy člověk pustil Fiddler Web Debugger a mohl v něm poklidně ladit svojí webovou aplikaci, aniž by se musel probírat stovkami HTTP requestů generovaných ostatními aplikacemi. Dnes je HTTP protokol natolik oblíbený, že použití Fiddler již není tolik pohodlné.

Naštěstí je možné Fiddlerovi říct, jaké requesty má ignorovat (resp. skrýt z UI, “odbavení” nadále provádí). Děje se tak např. prostřednictvím FiddlerScriptu, kde ve funkci OnBeforeRequest můžeme nastavit (výstřižek ze začátku funkce):

    static function OnBeforeRequest(oSession: Session) {       
      
        if (
            (oSession.hostname == "tfs.havit.eu")
            || (oSession.hostname == "outlook.office365.com")
            || (oSession.hostname == "havit.sharepoint.com")
            || (oSession.hostname == "tfs.havit.eu")
            || (oSession.hostname == "vortex.data.microsoft.com")
            || (oSession.hostname == "nexus.officeapps.live.com")
            || (oSession.hostname == "client-api.itunes.apple.com")
            || (oSession.hostname == "iadsdk.apple.com")
            || (oSession.hostname == "roaming.officeapps.live.com")
            || (oSession.hostname == "mobile.pipe.aria.microsoft.com")
            || (oSession.hostname == "play.itunes.apple.com")
        ) {
            oSession["ui-hide"]="yup";
        }

        // pokračování funkce

            

FiddlerScript najdeme v menu Rules pod volbou Customize Rules… “Ideálně” se edituje prostřednictvím FiddlerScript Syntax Highlight doplňku (na jeho instalaci se ptá Fiddler při otevírání položky Customize Rules…):

image

Kromě oSession.hostname můžeme použít i plné oSession.url, nebo další možnosti poskytovaného FiddlerScript API.

[ASP].NET Worst Practices – záznam, slides a dema [Prague .NET Meetup 02/2016]

Slides a dema z mé přednášky pro setkání Prague .NET Meetup ze 17.2.2016:

Záznam z přednášky je publikován na našem HAVIT YouTube Channel.

Dotčená témata

  • Garbage Collector, Finalization, C# Destructors, Resource Wrapper pattern
  • Process Failure, StackOverflow, Windows Debugger, DebugDiag
  • <compilation debug=“true|false“ />, <deployment retail=“true“/>
  • ASP.NET Over-posting / Mass-assignment
  • skládání stringů vs. StringBuilder
  • vyhledávání v datech – List vs. BinnarySearch vs. Dictionary vs. LINQ ToLookup()
  • perly code-review

[ASP].NET Performance Tuning – záznam, slides a dema [ShowIT SK 02/2016]

Slides a dema z mé přednášky pro konferenci Gopas ShowIT Bratislava z 9.2.2016:

Záznam z přednášky je publikován na našem HAVIT YouTube Channel.

Dotčená témata

  • ASP.NET Sessions
  • skládání stringů vs. StringBuilder
  • vyhledávání v datech – List vs. BinnarySearch vs. Dictionary vs. LINQ ToLookup()
  • reflexe + dynamic
  • ASP.NET Data Cache + Output Cache
  • SQL DMVs
  • YSlow