Author Archives: Robert Haken

avatar Neznámé

About Robert Haken

Software Architect, Founder at HAVIT, Microsoft MVP - ASP.NET/IIS

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.

Open Live Writer – encoding českých znaků titulku na HTML entity

Jedním z nastavení Open Live Writeru (open-sourced nástupce známého Microsoft Windows Live Writer) při publikování na blog je, zdali se má titulek postu encodovat do HTML. Tato volba je obvykle přečtena z autodiscovery manifestu blogu. Pokud tam není, má WLW pro jednotlivé platformy defaultní nastavení (zřejmě z ..\AppData\Local\Windows Live Writer\ResourceCache\live\BlogProvidersB5.xml, element <requiresHtmlTitles>).

image

Problém je, že některé blogovací platformy tuto volbu neřeší a třeba pro WordPress.com se tak dočkáte nastavení Yes a výsledkem jsou titulky HTML-encodované na entity a zmršená URL:

image

V samotném Live Writeru (WLW 2012, OLW 0.6) se mi nepodařilo najít možnost, jak tuto Blog Capability změnit. Nakonec jsem našel, kde má v registrech uložené své volby a jak tam onu vlastnost přepnout.

V sekci HKCU\Software\OpenLiveWriter\Weblogs (resp. HKCU\Software\Microsoft\Windows Live\Writer\Weblogs) je potřeba najít větev příslušného blogu (třeba dle BlogName nebo HomepageUrl) a v podsekci UserOptionOverrides přidat String Value s názvem „requiresHtmlTitles“ s hodnotou „No“. V mém případě třeba

[HKEY_CURRENT_USER\Software\Microsoft\Windows Live\Writer\Weblogs\d9719c4f-dbd8-4b66-bc58-222c156511c3\UserOptionOverrides]<br>"requiresHtmlTitles"="No"

Pokud máte souborový přístup k instanci WordPressu, můžete problém snadno vyřešit na straně serveru editací manifestu.

Update 2.3.2016: Nastavení pro Open Live Writer (původně bylo pro Windows Live Writer).

[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