Przygody z deadlockiem (czy jak kto woli – zakleszczeniem) w bibliotece ClrMd ciąg dalszy. W poprzedniej części obszedłem problem po stronie aplikacji, jednak chciałbym przyczynić się do poprawy życia ludzkości i naprawić ten problem w samej bibliotece. Widzę tu trzy wyjścia. Więcej...
W poprzednim poście posłużyłem się następującym kodem, mającym wczytać plik ze zrzutem pamięci i następnie załadować odpowiednią wersję pliku mscordacwks.dll:
use target = DataTarget.LoadCrashDump(@"..\..\..\..\data\ConsoleDump.exe.dmp")
target.SymbolLocator.SymbolPath <- @"SRV*http://msdl.microsoft.com/download/symbols"
target.SymbolLocator.SymbolCache <- @"c:\symbols"
for version in target.ClrVersions do
let dacInfo = version.DacInfo
let runtime = version.CreateRuntime()
Niestety, jak już wspomniałem, ten kod umieszczony w aplikacji WPF powoduje jej zawieszenie Więcej...
Miałem w zeszłym tygodniu przyjemność brania udziału w wydarzeniu zorganizowanym przez Microsoft w swojej siedzibie. Nie wiem czy taka była oficjalna nazwa, ale spokojnie można by je nazwać “Azure App Service Day”. Była to de facto mini konferencja na temat Azure, szczególnie w kontekście wspomnianych App Services. Więcej...
Z okazji rocznicy swojej działalności jako "prelegent", postanowiłem spojrzeć z auto-refleksją na swoje poczynania w tym czasie. Na spisanie wyników owych refleksji przyjdzie pora. Przy okazji jednak zauważyłem, że jest już całkiem dobry czas, by założyć podstronę o historii swoich wystąpień. A przy okazji mogę tam zawierać zapowiedzi również tych przyszłych, planowanych. Kto wie, może takie zebrane informacje pomogą komuś, kiedyś w przekonaniu się, czy warto zaakceptować moje kolejne CFP?
W rozwoju każdego oprogramowania przychodzi ten moment, że zdarza się pierwszy bug. Potem są już kolejne. No i ja mam za sobą ten etap – aż z wrażenia założyłem Issue we własnym projekcie:
Więcej...
Projekt MemoryVisualizera toczy się w kilku wątkach, ale jak na razie dość mało poświęciłem jednemu z najważniejszych - analizy pamięci. Planuję bardziej rozbudowany post o tym jak można się do pamięci dobrać i co tak naprawdę siedzi pod spodem. Na razie jednak jako "zajawkę" przedstawię sposób, którym się będę przez dłuższy czas posługiwał. A chodzi o świetną bibliotekę ClrMd, która to jako dostępna na Nuget, oferuje interfejs .NETowy do analizy pamięci. Szukając go w Visual Studio pamiętajmy zaznaczyć opcję "Include prerelease" ponieważ jest to wciąż biblioteka w wersji rozwojowej.
Więcej...
Jak już nie raz wspominałem, chciałbym by sercem MemoryVisualizera był język zapytań oparty o Cypher, a właściwie leżąca pod spodem baza grafowa Neo4j. Ma mi to zapewnić dużą ekspresyjność zapytań oraz (mam nadzieję) dużą szybkość działania. Tutaj pojawia się pewien drobny temat do przemyślenia. Neo4j napisany jest w Javie i szczęściarze piszący w tym języku mogą załączyć ten silnik jako część swojej aplikacji. Niestety w aplikacji .NETowej o takim self-hostowaniu nie może być mowy. Portu Neo4j na .NET nie ma, choć pojawiły się i takie pomysły, np. w formie Neo4Net. Ciekawa dyskusja na ten temat odbyła się na grupie lists.neo4j.org. Więcej...
Poza pasją do programowania i gadania o nim, mam również inne. Jedną z nich jest fotografia. A ponieważ jest to mój blog, a nie czyjś inny, pomyślałem, że opowiem o tym w ramach przybliżania swojej osoby. Zatem do dzieła, pierwszy post nie związany z IT! Mimo że nie jest IT i jest dość długi, zachęcam do przeczytania!
Fotografia przez wiele lat praktycznie dla mnie nie istniała, kojarzyła się głównie z robieniem wakacyjnych fotek. Miałem jednak jako nastolatek krótki przebłysk zainteresowania tematem. Odgrzebałem nawet całkiem przyzwoitego Zenita, modelu niestety nie pamiętam. Wraz z trzema obiektywami pozwalało to na pewną zabawę, ale analogowa technologia i potrzeba wywoływania zdjęć dość szybko ostudziła mój zapał. Więcej...
W poprzedniej części wątku WPFowego projektu MemoryVisualizer skupiłem się na przypomnieniu, czym jest i jak implementować komendę (interfejs ICommand) w C#. Dla przypomnienia, napisałem ogólne rozwiązanie, któremu podaje się odpowiednie metody, dzięki czemu jest całkowicie reużywalne:
public class CommandHandler : ICommand
{
private Action action;
private Func<bool> canExecute;
public CommandHandler(Action action, Func<bool> canExecute)
{
this.action = action;
this.canExecute = canExecute;
}
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return canExecute();
}
public void Execute(object parameter)
{
action();
}
}
Muszę to przełożyć na F#, żeby używać komend w MemoryVisualizerze. Więcej...
Memory Visualizer wymaga udostępnienia języka zapytań odnośnie obiektów i struktur w pamięci. Jak pisałem w części Cypher, co to jest?! , język ten nazywam MQL - Memory Query Language. W istocie jest to jednak po prostu Cypher, który rozszerzę o elementy kontrolujące sposób wyświetlania.
Aby sobie przypomnieć, co chcę osiągnąć, wróćmy do przykładowego rysunku z opisu projektu:
Więcej...