Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc

Windows 7 BitLocker constantly asks for USB key after TPM was disabled and reenabled in BIOS

I use Bitlocker with my laptops and I recommend it for everyone.

Unfortunately after a "strange" reboot my computer didn't start as usual, but asked for USB drive with key.
And it kept asking for it every time.

Quick bios check showed that TPM module has been disabled. I enabled it.
Then I initialized TPM module in Windows. This still didn't resolve the problem, even that command
manage-bde -protectors -get c:
showed that all configured key protectors are present: external key and TPM.

I deleted the TPM protector by
manage-bde -protectors -delete c: -type tpm
and added it once again by
manage-bde -protectors -add c: -tpm

Update: if you receive a message saying you don't have TPM ownership, please use the following command to obtain it, and then retry the command above:
manage-bde -tpm -t -o <enter owner password>

It solved the problem and now I can boot without being asked for key on my usb drive.
Hope this helps.
opublikowano przez Bysza | 0 komentarzy
Filed under:

Visual Studio 2010 - raport z drillthrough nie działa (drillthrough report does not work)

Używasz raportów (rdlc) w Visual Studio 2010 z opcją drillthrough?
Jeżeli tak, to poniższy link będzie Ci przydatny:


Otóż po instalacji SP1 do Visual Studio 2010, raporty drillthrough po prostu przestają działać.
Jednym z rozwiązań, o ile nie jedynym, jest cofnięcie się do Report Viewer 2010 (bez SP1).
Ot, mała przykrość po zainstalowaniu SP1.
opublikowano przez Bysza | 2 komentarzy
Filed under: ,

ClickOnce deployment (Publish) ignores InstallUrl in command line builds (msbuild) [EN]

When you change InstallUrl property in Visual Studio 2010 ClickOnce property pages and publish your solution, new value is honored and embedded into application manifest file. Everything works as expected.

But when you do it through a build file (eg. targets) and build it directly using msbuild, new value is ignored. Rebuild does not help.

To successfuly change this particular property, you need to pass new value for InstallUrl directly to msbuild and force a rebuild. It's the only working solution I have found.

The following example script works as expected:

msbuild My.sln /t:Publish /p:Configuration="Rebuild;Release" /p:InstallUrl="http://my.new.url.com/"
opublikowano przez Bysza | 0 komentarzy
Filed under:

TFS 2010 gated checkin & integration build [EN]

My case with continuous integration on TFS 2010 is simple: I want to provide a gated checkin as a first quality gate, and a full CI build as second. Since the project has lots of tests, where half of it are unfortunately database bound, it takes a lot of time to build and test.

To implement my desired build configuration, I defined a gated checkin build to compile and run basic set of tests.
It worked well, but second build which runs all tests in Debug and Release configuration did not start. What’s going on?

Well, it’s by design…
TFS team decided to switch off a CI build if gated one is successful by adding a “***NO_CI***” string to checkin comments. This string causes all CI build trigger defined to ignore this checkin. You can read more about this option on Buck Hodges blog post http://blogs.msdn.com/b/buckh/archive/2007/07/27/tfs-2008-how-to-check-in-without-triggering-a-build-when-using-continuous-integration.aspx.
In short the ***NO_CI*** string is useful if our build causes checkins on its own and we don’t want to start another build and end up in infinite loop.

To turn off the default gated build behavior and allow other builds to start, we need to edit a build template our build is based on and change the NoCIOption to “False”.
opublikowano przez Bysza | 0 komentarzy
Filed under:

VS 2010 + Quest Toad Extensions 1.0 = stracony czas

Tytuł mówi sam za siebie. Bardzo liczyłem na to oprogramowanie, bo pomogłoby nam w codziennej pracy z Oracle tak, jak DBpro pomaga w pracy z SQL Server.

Toad Extensions dla VS 2010 (TE) ma za zadanie dostarczyć providera schematu bazodanowego Oracle do VS 2010. Muszę przyznać że częściowo to się nawet udało, tj. widać kod źródłowy w VS 2010...

Podpiąłem się do bazy danych którą utrzymujemy: 400+ tabel, kilkaset pakietów, funkcji, mnóstwo typów i różnych innych sztuczek w PL/SQL. Ładowanie tego schematu nie trwało długo, ale lista błędów parsowania PL/SQL i samego schematu zgłoszonych przez TE, mnie zadziwiła.

Poniżej niektóre z nich:

  • Unknown type sys_refcursor (!)
  • Unknown type BLOB (!)
  • Unknown type pakiet.definicja_typu (!)
  • Table partitioning is not supported
  • Index column expressions are not supportedNotka
  • External tables are not supported

Nie znam wiele baz danych pod Oracle, gdzie nie są używane typy własne w pakietach lub typ sys_refcursor, ale może zbyt mało widziałem w życiu...

Moje wrażenia są następujące: niestety TE v 1.x nie nadaje się do utrzymywania schematów baz danych Oracle, których komplikacja wykracza poza kilka prostych konstrukcji PL/SQL.

Jeżeli ktoś ma inne (lepsze?) doświadczenia z TE, proszę o komentarz.

opublikowano przez Bysza | 0 komentarzy

Szacunek dla organizatorów MTS 2009 :)

Moje pozytywne wrażenia po MTS 2008 przyćmiła organizacja imprezy.
Jak wiadomo, człowiek może odpowiednio docenić wrażenia wyższego poziomu dopiero wtedy, gdy niższe potrzeby są zaspokojone.
O to w 2008 roku było niełatwo.

Co innego MTS 2009. Już po 1. dniu mogę spokojnie stwierdzić że konferencja jest bardzo udana.
Organizacja imprezy na bardzo wysokim poziomie. Pozwala to skupić się na aspektach technicznych i wartości merytorycznej sesji, nie pozostawiając miejsca na marudzenie :)

Sesje Tomka Onyszko i Johna Craddock'a wspaniałe.

Chylę czoła organizatorom i serdecznie pozdrawiam, gratulując bardzo udanego eventu.

opublikowano przez Bysza | 0 komentarzy

TFS Web Access 2010 w języku polskim przed RTM?

Trwają prace nad VSTS 2010, czas zatem zainteresować się lokalizacją Web Access dla TFS.

Najprawdopodobniej przed ukazaniem się wersji Beta 2, uda się wyciągnąć odpowiednie materiały z MS tak, by można było przygotować lokalizację dedykowaną dla tej wersji.

Jak będzie zobaczymy, natomiast wszystkie znaki wskazują na to, że wraz z ukazaniem się wersji RTM, dostępna będzie również polska wersja narzędzia TFS Web Access 2010.

Tak w ogóle to mam pytanie: czy ktoś z Was używa zlokalizowanej wersji w swoim TFS 2008? ;)
opublikowano przez Bysza | 3 komentarzy
Filed under:

VSTS Database Edition dostępna za darmo dla posiadaczy VSTS Team Developer.

Nie wiem jak udało mi się przeoczyć zdarzenie, na które liczyłem od ponad roku.
No i stało się to ponad miesiąc temu!

Liczyłem że edycja Visual Studio for Database Professionals będzie dostępna dla tych, którzy posiadają wersję Team Developer.
Podział na dwa produkty był sztuczny. Ile projektów opiera się tylko o kod .net, nie dotykając bazy danych?
Problemy z:
  • wersjonowaniem schematu?
  • refaktoryzacją?
  • porównywaniem schematów?
  • testami jednostkowymi bazy danych...?
Te i wiele innych problemów jest zaadresowanych w VSTS Database Edition.

Wszyscy dotychczasowi użytkownicy VSTS Team Developer wersje 2005 i 2008, mogą ściągnąć z MSDN wersję VSTS Database Edition.
Dotyczy to również partnerów MS, którzy poprzez uczestnictwo w programie oraz odpowiednie kompetencje (Custom Development lub ISV) posiadają już VSTS Team Developer.

Wszystkie szczegóły "promocji" są dostępne tutaj.
Informacje o produkcie można uzyskać tutaj.
opublikowano przez Bysza | 2 komentarzy
Filed under:

TFS Web Access 2008 dostępny w języku polskim

Miło mi poinformować że w ramach projektu Team System Web Access Translations (http://www.codeplex.com/TSWAL/), rozpoczętego przez Marcela de Vries (TFS MVP), opublikowaliśmy wersję 1.0 tłumaczenia Team Foundation Web Access 2008 na język polski, której jestem skromnym autorem.

Tłumaczenie dotyczy również rozszerzenia WIWA, dostępnego od wersji TFS WA 2008 SP1.

Poza polskim, dostępne są następujące pakiety lokalizacyjne:

Mam nadzieję że polska lokalizacja umożliwi szerszą adopcję tego produktu w Polsce, nie tylko w środowisku deweloperów i specjalistów IT, ale również przez użytkowników końcowych, którym pozwoli na interakcję z systemem w języku ojczystym.

Liczę że wersja 1.0 tłumaczenia przyda się wielu zespołom. Zachęcam do dyskusji na temat zwrotów przyjętych w tłumaczeniu i zgłaszania uwag. Nieczęsto można  wpłynąć na to, w jaki sposób przetłumaczony jest produkt Microsoftu.

Gratulacje dla wszystkich członków zespołu i Marcela, za wykazanie inicjatywy i wydobycie plików źródłowych z Microsoftu.

Odnośniki do notek Marcela de Vries i Briana Harry’ego na temat udostępnienia v1 pakietu lokalizacyjnego.


Instalacja pakietu lokalizacyjnego jest bardzo prosta:

1. Pobrać instalator w pliku MSI z http://www.codeplex.com/TSWAL/Release/ProjectReleases.aspx?ReleaseId=18055

2. Uruchomić plik MSI na serwerze, na którym zainstalowany jest Team System Web Access 2008 lub wyżej.

3. Zrestartować pulę aplikacyjną, w której działa TSWA, lub zrestartować IISa.

Po zainstalowaniu, system powinien automatycznie rozpoznać używaną w przeglądarce wersję językową i dostosować do niej interfejs użytkownika.

Alternatywną metodą jest ręczne wymuszenie języka, poprzez menu Settings -> Profile -> Options, a następnie przejście do zakładki Regional settings i ustawienie żądanego języka.

Poniżej prezentuję kilka zrzutów ekranu, prezentujących interfejs w języku polskim. Proszę zwrócić uwagę że z powodu angielskiej wersji metodyki zainstalowanej w TFS, niektóre słowa mogą być wyświetlane w języku angielskim i są one niezależne od wersji językowej TFS WA:

TFWA-pl-screen1

TSWA-pl-screen2

TSWA-pl-screen3

TSWA-pl-screen4

opublikowano przez Bysza | 2 komentarzy
Filed under:

Lokalizacja TFS Web Access 2008 na język polski

Czy ktoś zauważył że nie mamy zlokalizowanego TFS Web Access na język polski?
To nieładnie ze strony MS, że pomija tak ważny kraj w Europie Centralnej, pełen wspaniałych i inteligentnych ludzi :)

Skoro MS nas nie docenia, to nie ma co lamentować, tylko wziąść się za robotę i nikogo nie prosząc zrobić to samemu.
Niestety nie zauważyłem wielu chętnych, zatem postanowiłem dołączyć się do projektu TSWAL na CodePlex i zrobić to tłumaczenie.

I tutaj mam mały problem, bynajmniej nie związany z brakiem rąk do pracy, tylko z tłumaczniem niektórych zwrotów.
Może zechcielibyście dopomóc i wrzucić Wasze propozycje?
Swoich specjalnie nie publikuję, by nikogo nie sugerować.

Oto problematyczne pojęcia:
  • check-in
  • check-out
  • changeset
  • shelve
  • shelveset
  • work item
  • build
  • bug
  • quality requirement
Będę wdzięczny za propozycje :)
opublikowano przez Bysza | 5 komentarzy
Filed under:

[EN] PDC 2008 sessions available on the net

I took some time to select and group PDC 2008 sessions available on the net – usually on Channel9 – because existing search and filtering did not fit my needs.

Basically I wanted to select just the sessions that I was most interested with, but after some time the list went just too big, so finally I have included almost all of them. Enjoy... :-)

Web technologies

ASP.NET 4.0 Roadmap

ASP.NET AJAX Futures

ASP.NET MVC: A New Framework for Building Web Applications

Microsoft Visual Studio: Easing ASP.NET Web Deployment

ASP.NET and JQuery

Developing with Microsoft .NET and ASP.NET for Server Core

ASP.NET: Cache Extensibility

Microsoft Visual Studio: Web Development Futures

Deep Dive: The New Rendering Engine in Microsoft Internet Explorer 8

Building High Performance JScript Applications

IIS 7.0 and Beyond: The Microsoft Web Platform Roadmap

Web Application Packaging and Deployment

Future & plans

ASP.NET AJAX Futures

Microsoft Visual Studio: Web Development Futures

SQL Services: Futures

WPF: Extensible BitmapEffects, Pixel Shaders, and WPF Graphics Futures

Microsoft .NET Framework: CLR Futures

Entity Framework Futures

Future Directions for Microsoft Visual Basic

Microsoft Sync Framework Advances

SharePoint

SharePoint Online: Extending Your Service

SharePoint 2007: Creating SharePoint Applications with Visual Studio 2008

SharePoint 2007: Advanced Asynchronous Workflow Messaging

SQL Server

SQL Services: Tips and Tricks for High-Throughput Data-Driven Applications

SQL Server 2008: Beyond Relational

SQL Server 2008: Developing Large Scale Web Applications and Services

SQL Server 2008: Business Intelligence and Data Visualization

A Lap around SQL Services

SQL Services: Futures

Microsoft SQL Server 2008: Powering MSDN

SQL Server 2008: Developing Secure Applications

SQL Server 2008: New and Future T-SQL Programmability

SQL Server Compact: Embedding in Desktop and Device Applications

SQL Server 2008: Deep Dive into Spatial Data

Silverlight

Microsoft Silverlight, WPF and the Microsoft .NET Framework: Sharing Skills and Code

Deep Dive: Building an Optimized, Graphics-Intensive Application in Microsoft Silverlight

Silverlight Controls Roadmap

Microsoft Silverlight 2: Control Model

Microsoft Expression Blend: Tips & Tricks

WCF

WCF: Zen of Performance and Scale

WCF 4.0: Building WCF Services with WF in Microsoft .NET 4.0

WCF: Developing RESTful Services

WPF

WPF: Extensible BitmapEffects, Pixel Shaders, and WPF Graphics Futures

WPF: Data-centric Applications Using the DataGrid and Ribbon Controls

Visual Studio & Team System

Microsoft Visual Studio Team System: Software Diagnostics and Quality for Services

Microsoft Visual Studio: Bringing out the Best in Multicore Systems

Team Foundation Server 2010: Cool New Features

Microsoft Visual C# IDE: Tips and Tricks

Microsoft Visual Studio Team System: A Lap Around VSTS 2010

Visual Studio Debugger Tips & Tricks

Agile Development with Microsoft Visual Studio

Microsoft Visual Studio Team System: Leveraging Virtualization to Improve Code Quality with Team Lab

Parallel Programming for Managed Developers with the Next Version of Microsoft Visual Studio

Microsoft Visual Studio Team System Team Foundation Server: How We Use It at Microsoft

Microsoft Visual Studio: Customizing and Extending the Development Environment

.Net Framework & C#

The Future of C#

Improving .NET Application Performance and Scalability

Under the Hood: Advances in the .NET Type System

Microsoft .NET Framework: Overview and Applications for Babies

Microsoft .NET Framework: CLR Futures

Mono and .NET

Microsoft .NET Framework: Declarative Programming Using XAML

Managed and Native Code Interoperability: Best Practices

Design & architecture

Designing Your Application to Scale

Framework Design Guidelines

Panel: The Future of Programming Languages

Architecture of the .NET Services

Architecture without Big Design Up Front

Parallel Symposium: Application Opportunities and Architectures

Inside the Olympics: An Architecture and Development Review

Behind the Scenes: How We Built a Multi-Enterprise Supply Chain Application

Programming & quality

Panel: The Future of Unit Testing

Improving Code Quality with Code Analysis

Research: Concurrency Analysis Platform and Tools for Finding Concurrency Bugs

Enabling Test Automation Using Windows Server 2008 Hyper-V

Parallel Symposium: Addressing the Hard Problems with Concurrency

Research: Contract Checking and Automated Test Generation with Pex

Velocity

Project "Velocity": A First Look

Project "Velocity": Under the Hood

Windows Azure

A Lap Around Windows Azure

A Lap Around the Azure Services Platform

WF

WF 4.0: A First Look

WF 4.0: Extending with Custom Activities

WCF 4.0: Building WCF Services with WF in Microsoft .NET 4.0

Windows 7

Windows 7: Empower users to find, visualize and organize their data with Libraries and the Explorer

Windows 7: Deploying Your Application with Windows Installer (MSI) and ClickOnce

Miscellaneous

Microsoft Dynamics CRM: Building Line-of-Business Applications

PowerShell: Creating Manageable Web Services

Developing for Microsoft Surface

Developing Solutions for Windows Server 2008 Hyper-V Using WMI

How to Develop Supercomputer Applications

Offline-Enabled Data Services and Desktop Applications

Office Communications Server 2007 R2: Enabling Unified Communications

Microsoft Application Virtualization 4.5

.NET Services: Connectivity, Messaging, Events, and Discovery with the Service Bus

Research: BAM, AjaxScope, and Doloto

opublikowano przez Bysza | 0 komentarzy

TFS 2010 (Rosario) features

Channel9 opublikował kilka ciekawych pozycji na temat TFS 2010.
Wszystkie nagrania pochodzą z PDC 2008:
  1. Microsoft Visual Studio Team System: A Lap Around VSTS 2010
  2. Team Foundation Server 2010: Cool New Features
  3. Microsoft Visual Studio Team System: Software Diagnostics and Quality for Services
Właśnie udostępniono uaktualnioną wersję Visual Studio 2010 September 2008 CTP w wersji VPC, do ściągnięcia tutaj.

Ten release będzie duży, w przeciwieństwie do TFS 2005 -> 2008.
Masa nowej funkcjonalności, którą lepiej zobaczyć na własne oczy, niż o niej czytać ;)
Dlatego polecam powyższe nagrania.

Dodatkowo warto obejrzeć:
  1. Research: Contract Checking and Automated Test Generation with Pex, gdzie prezenterzy Mike Barnett (ten od Spec#) i Nikolai Tillmann pokazują projekt Pex.
  2. Microsoft Visual C# IDE: Tips and Tricks.
opublikowano przez Bysza | 2 komentarzy
Filed under:

Polecam backupy online. Dla celów prywatnych za darmo.

Nie przepadam specjalnie za reklamowaniem produktów, w szczególności nie swoich ;), ale tutaj należy się wyjątek.

Każdy użytkownik komputera zwykle cierpi, gdy szlag trafia jego/jej dane. W szczególności gdy nie były zabezpieczone aktualną kopią zapasową. Z jednej strony chcielibyśmy mieć nasze dane zabezpieczone, z drugiej natomiast, po prostu nam się nie chce. Najfajniej byłoby uzyskać bezpieczeństwo bez wysiłku, automatycznie i za darmo.

Co jeżeli jednak nie mamy odpowiedniego nośnika lub nie chcemy w niego inwestować? Co z dobrymi praktykami, jak  szyfrowanie, czy przechowywanie kopii w innym miejscu, niż same dane? Byłoby miło przechowywać nasze dane w profesjonalnie zarządzanym centrum danych, nie martwić się harmonogramem kopii, zmienianiem taśm, nie płacić i być zgodnym ze wszystkimi, zalecanymi praktykami.

Brzmi nieźle, tylko jak to zrobić? Na ratunek przychodzi nam backup online: instalujemy agenta, określamy harmonogram, zakres danych i nakazujemy kopiowanie przez internet naszych cennych zasobów do centrum danych po drugiej stronie Atlantyku.

Od 17. marca 2008 testuję jedno z takich rozwiązań: mozy home.

Z całą odpowiedzialnością mogę polecić to rozwiązanie wszystkim. Działa ono jak każde dobre narzędzie - człowiek momentalnie się przyzwyczaja i zupełnie zapomina o jego istnieniu. Jak z prądem elektrycznym: ono po prostu jest :)

Rejestracja konta użytkownika i instalacja oprogramowania jest bardzo prosta. Oprogramowanie od początku działało bez zarzutu, nawet na mojej Viście 64bit. Wystarczy wejść na https://mozy.com/registration/free i zarejestrować konto. Potem ściągnąć oprogramowanie, zainstalować je, określić zakres danych i politykę szyfrowania. Możemy użyć klucza przechowywanego w centrum danych, lub wskazać własny i martwić się o niego samemu.

Odtwarzanie danych jest intuicyjne. Całość integruje się z powłoką Windows i jest za darmo do użytku prywatnego. Możemy wykorzystać maksymalnie 2 GB, ale powiększenie nie jest trudne: każdy może wskazać zaprzyjaźnione osoby jako referencje. Wtedy obie strony otrzymują po 250 MB więcej.

Wydajności rozwiązania niewiele można zarzucić. Pierwszy backup jest duży, bo kopiuje wszystko co zaznaczyliśmy, ale kolejne kopie są różnicowe. Wysyłane są tylko te dane, które się zmieniły. W moim przypadku, na 1.2 GB danych pod backupem, dzienna paczka zamyka się średnio w 30 MB.

Jedyne o czym musimy pamiętać to pozostawić komputer na noc (czy kiedy tam sobie chcemy) włączony i podłączony do sieci.

Mam nadzieję że powyższy tip uratuje komuś skórę... :)

opublikowano przez Bysza | 11 komentarzy
Filed under:

Diagnostyka wycieków pamięci

W poniższym artykule wykorzystano materiały znajdujące się w następujących artykułach Tess:

http://blogs.msdn.com/tess/archive/2005/11/25/i-have-a-memory-leak-what-do-i-do-defining-the-where.aspx

http://blogs.msdn.com/tess/archive/2005/11/25/dumpheap-stat-explained-debugging-net-leaks.aspx

Uwaga: postanowiłem nie tłumaczyć większości pojęć w CLR, np. takich jak „assemblies”, „loader”, „viewstate”, itp. Wychodzą z tego potworki językowe, które wprowadzają tylko zamieszanie i niekoniecznie muszą być wszystkim znane. Jeżeli kogoś razi takie podejście, to z góry przepraszam.
Jednocześnie proszę o zwrócenie mi na to uwagi – jeżeli liczba niezadowolonych będzie duża, postaram się ustalić jakiś wspólny mianownik.

Rozróżnijmy dwa pojęcia: wyciek pamięci oraz wysokie użycie pamięci.
Z wyciekiem pamięci mamy do czynienia gdy zaalokujemy pamięć i zagubimy do niej wskaźnik, co prowadzi do tego, że nie możemy jej zwolnić.

Dopóki mamy wskaźnik do zaalokowanej pamięci, mówimy o wysokim użyciu pamięci.

Obie sytuacje mogą być równie złe z naszego punktu widzenia i prowadzić do podobnych skutków, jednak nadal są one różne.

Dla uproszczenia, w dalszej części artykułu będziemy używać terminu „wyciek pamięci.”

Wyróżniamy dwa typy wycieków pamięci: stopniowy, gdzie użycie pamięci rośnie w przybliżeniu liniowo, i nagły. Rozwiązujemy je w podobny sposób, jednak przy nagłym wycieku staramy się znaleźć powiązane, wyjątkowe zdarzenie, które zaszło w chwili wycieku, np. bardzo duże obciążenie serwera, itp.

Pamięć procesu zawiera wiele różnych bytów, takich jak wątki, zarządzane sterty, zarządzaną stertę loader’a, natywne sterty, biblioteki dll i alokacje wirtualne dokonywane przez obiekty COM, zatem dobrym miejscem by zacząć, jest sprawdzenie w monitorze wydajności następujących liczników:

Process/Virtual Bytes Ilość zaalokowanej pamięci wirtualnej.
Process/Private Bytes   Ilość zaalokowanej pamięci fizycznej.
.net CLR Memory/# Bytes in all Heaps Ilość bajtów we wszystkich stertach.
.net CLR Memory/% Time in GC Procent czasu działania aplikacji, spędzony na odśmiecanie.
.net CLR Memory/Large Object Heap size Ilość zaalokowanej pamięci na stercie dla dużych obiektów (Large Object Heap - LOH).
Duże obiekty to te, których wielkość przekracza 85 000 bajtów.
.net CLR Loading/Bytes in Loader Heap Ilość bajtów zaalokowanych na stercie loadera.
.net CLR Loading/Current Assemblies Ilość załadowanych assemblies.

Poszukujemy takiej sytuacji, gdzie ilość bajtów prywatnych rośnie w przybliżeniu w tym samym tempie, co ilość bajtów wirtualnych, oraz czy „#Bytes in all Heaps” podąża tą samą ścieżką.

Jeżeli ilość bajtów prywatnych będzie się zwiększać, ale „#Bytes in all Heaps” pozostanie bez zmian, mamy prawdopodobnie do czynienia z wyciekiem natywnej pamięci, np. z powodu alokacji dokonywanych przez komponenty COM. Jeżeli „#Bytes in all Heaps” zwiększa się w podobnym tempie jak bajty prywatne, wyciek jest zlokalizowany w kodzie zarządzanym.

Podobnie, jeżeli widać zwiększającą się ilość bajtów wirtualnych, ale bajty prywatne pozostają bez zmian, problemem jest pewnie rezerwacja dużej ilość pamięci wirtualnej, która nie jest później używana.

Z chwilą uruchomienia procesu i załadowania wszystkich domen aplikacyjnych (appdomains), liczniki „#Bytes in Loader Heap” i „#Current Assemblies” powinny utrzymywać się na niezmienionym poziomie. Jeżeli jednak liczniki te rosną, bardzo prawdopodobny jest wyciek pamięci z assembly loader’a.

Jeżeli mamy do czynienia z aplikacją w ASP.net, należy sprawdzić w web.config, czy atrybut debug=”false” oraz symptomy, nie są identyczne z opisanymi w artykułach KB:
Memory usage is high when you create several XmlSerializer objects oraz Assembly leak because of script blocks in XSLT's.

Użycie WinDbg do debugowania wycieku pamięci zarządzanej

Najbardziej pomocnym poleceniem WinDbg w przypadku debugowania wycieku pamięci zarządzanej jest !dumpheap. Pokazuje ono listę wszystkich obiektów na zarządzanych stertach, a używając różnych przełączników tego polecenia, możemy formatować wyniki.

!dumpheap jest poleceniem wbudowanym w rozszerzenie SOS, które otrzymujemy wraz z instalacją .Net Framework. Plik zlokalizowany jest w folderze, w którym zainstalowaliśmy .Net Framework. Jeżeli zainstalowaliśmy SDK v1.1 w domyślnym folderze, podstawowy opis użycia SOS możemy znaleźć w C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\Samples\sos.

Rozróżniamy dwie kategorie obiektów przechowywanych na stercie:

  • obiekty które są zakorzenione (rooted), np. jakiś obiekt przechowuje do nich wskaźnik (referencję),
    oraz
  • obiekty które zostały właśnie utworzone (młode) lub przestały być zakorzenione od czasu ostatniego odśmiecania.

By uniknąć przeglądania dużej ilości danych, które i tak zostaną usunięte podczas najbliższego odśmiecania, można posłużyć się pożytecznym trikiem:
1. obciążyć aplikację (stress),
2. ręcznie wymusić odśmiecanie, wywołując GC.Collect(3),
3. wykonać zrzut pamięci procesu (dump),
4. obciążyć aplikację (stress) po raz kolejny,
5. ręcznie wymusić odśmiecanie, wywołując GC.Collect(3),
6. wykonać zrzut pamięci procesu (dump),
7. porównać obiekty znajdujące się na stertach w obydwu zrzutach.

Przełącznik -stat polecenia !dumpheap, pokazuje zestawienie statystyk dotyczących obiektów na stercie:
0:000> !dumpheap -stat
0x79c489a0          1            12 System.Runtime.Remoting.Messaging.ClientContextTerminatorSink
0x79bf9aec          1            12 System.IO.TextReader/NullTextReader
0x79be7078          1            12 System.Runtime.Remoting.Proxies.ProxyAttribute
0x79bce8e0          1            12 System.Runtime.InteropServices.ComVisibleAttribute
0x79bce7c8          1            12 System.CLSCompliantAttribute
0x79bc08e0          1            12 System.Empty
0x0618ae68          1            12 System.Web.Configuration.CustomErrorsConfigHandler
0x061887f8          1            12 System.Web.UI.WebControls.UnitConverter
0x06180848          1            12 System.Drawing.ColorConverter
0x05dbfbc4          1            12 System.Data.Res
<… wycięto …>
0x03f1236c        625     2,820,896 System.Char[]
0x04ad88f4    102,874     2,880,472 System.Web.UI.ControlCollection
0x0469bdf0    156,650     3,133,000 System.Collections.Specialized.HybridDictionary
0x04ad91bc    164,516     3,290,320 System.Web.UI.Triplet
0x03f134a8      7,582     3,799,704 System.Collections.Hashtable/bucket[]
0x04ade5e4     47,395     4,549,920 System.Web.UI.WebControls.Label
0x061826bc     58,197     4,888,548 System.Web.UI.DataBoundLiteralControl
0x04adff44    323,119     5,169,904 System.Web.UI.StateItem
0x0618788c     63,437     6,089,952 System.Web.UI.WebControls.TableCell
0x0469c5c4    309,132     6,182,640 System.Collections.Specialized.ListDictionary/DictionaryNode
0x0011cec0        305     6,240,720      Free
0x79ba2ee4    270,831     6,499,944 System.Collections.ArrayList
0x03f16d9c        222     7,703,284 System.DateTime[]
0x04add34c    105,502     8,018,152 System.Web.UI.LiteralControl
0x0615c6f4    558,019    11,160,380 System.Data.DataRowView
0x03f15d1c      3,783    15,447,528 System.Boolean[]
0x060bcc74    570,274    22,810,960 System.Data.DataRow
0x03f15fd4        702    50,930,472 System.Decimal[]
0x03f131e8     21,013    60,573,352 System.Int32[]
0x03f1209c    508,734    75,399,184 System.Object[]
0x79b94638  5,286,303   697,441,440 System.String
Total 9,712,896 objects, Total size: 1,032,127,612

Pierwsza kolumna zawiera identyfikator z tabeli metod danego typu. Jeżeli zrzucimy dane wybranego obiektu, pierwszą wartością DWORD będzie identyfikator tabeli metod, która zawiera wskaźniki do informacji o danym typie, takie jak lista zmiennych składowych, lista implementowanych metod, itp. Tabela metod unikalnie identyfikuje typ.

Druga kolumna zawiera ilość obiektów danego typu na stercie. W powyższym przykładzie na stercie zaalokowanych jest 5.286.303 obiektów typu string.
Trzecia kolumna zawiera całkowity rozmiar pamięci zajmowanych przez te obiekty, zatem nasze stringi zajmują na stercie około 695 MB. Uwaga: całkowity rozmiar obiektów nie zawiera zmiennych składowych.

Rozważmy przykład klasy System.Data.DataSet:
0x060bbd2c        221        17,680 System.Data.DataSet

Widzimy że na stercie znajduje się 221 obiektów klasy DataSet, które zajmują w sumie 17.680 bajtów, co oznacza że średnio zajmują one 80 bajtów. Jeżeli prezentowana wartość reprezentowałby całkowity rozmiar obiektu data set, byłyby to bardzo małe obiekty.

Jeżeli wyświetlimy listę obiektów klasy DataSet, poprzez polecenie !dumpheap –mt <tabela metod>, a następnie wybierzemy jeden z nich i wyświetlimy jego zawartość poprzez !dumpobj <adres>, zobaczymy listing podobny do poniższego:

0:000> !dumpobj 0x3920ed4c
Name: System.Data.DataSet
MethodTable 0x060bbd2c
EEClass 0x060d2614
Size 80(0x50) bytes
GC Generation: 2
mdToken: 0x0200003b  (c:\windows\assembly\gac\system.data\1.0.5000.0__b77a5c561934e089\system.data.dll)
FieldDesc*: 0x060bb358
        MT      Field     Offset                 Type       Attr      Value Name
0x060b252c 0x4000583      0x4                CLASS   instance 0x00000000 site
0x060b252c 0x4000584      0x8                CLASS   instance 0x00000000 events
0x060b252c 0x4000582        0                CLASS     shared   static EventDisposed
    >> Domain:Value 0x001192a0:NotInit  0x0017fc40:NotInit  0x044b7b28:0x1c357cb8 <<
0x060bbd2c 0x40003d3      0xc                CLASS   instance 0x00000000 defaultViewManager
0x060bbd2c 0x40003d4     0x10                CLASS   instance 0x3920ee28 tableCollection
0x060bbd2c 0x40003d5     0x14                CLASS   instance 0x3920ed9c relationCollection
0x060bbd2c 0x40003d6     0x18                CLASS   instance 0x00000000 extendedProperties
0x060bbd2c 0x40003d7     0x1c                CLASS   instance 0x1c357c90 dataSetName
0x060bbd2c 0x40003d8     0x20                CLASS   instance 0x182d0224 _datasetPrefix
0x060bbd2c 0x40003d9     0x24                CLASS   instance 0x182d0224 namespaceURI
0x060bbd2c 0x40003da     0x40       System.Boolean   instance 0 caseSensitive
0x060bbd2c 0x40003db     0x28                CLASS   instance 0x14309a0c culture
0x060bbd2c 0x40003dc     0x41       System.Boolean   instance 1 enforceConstraints
0x060bbd2c 0x40003dd     0x42       System.Boolean   instance 0 fInReadXml
0x060bbd2c 0x40003de     0x43       System.Boolean   instance 0 fInLoadDiffgram
0x060bbd2c 0x40003df     0x44       System.Boolean   instance 0 fTopLevelTable
0x060bbd2c 0x40003e0     0x45       System.Boolean   instance 0 fInitInProgress
0x060bbd2c 0x40003e1     0x46       System.Boolean   instance 1 fEnableCascading
0x060bbd2c 0x40003e2     0x47       System.Boolean   instance 0 fIsSchemaLoading
0x060bbd2c 0x40003e3     0x2c                CLASS   instance 0x00000000 rowDiffId
0x060bbd2c 0x40003e4     0x48       System.Boolean   instance 0 fBoundToDocument
0x060bbd2c 0x40003e5     0x30                CLASS   instance 0x00000000 onPropertyChangingDelegate
0x060bbd2c 0x40003e6     0x34                CLASS   instance 0x00000000 onMergeFailed
0x060bbd2c 0x40003e7     0x38                CLASS   instance 0x00000000 onDataRowCreated
0x060bbd2c 0x40003e8     0x3c                CLASS   instance 0x00000000 onClearFunctionCalled
0x060bbd2c 0x40003e9        0                CLASS     shared   static zeroTables
    >> Domain:Value 0x0017fc40:NotInit  0x044b7b28:0x1c357c80 <<

Wspomniane 80 bajtów wystarczy do przechowania wszystkich wskaźników do zmiennych składowych, ale dane rzeczywiście składowane w DataSet, znajdują się w kolekcji tabel i jej zmiennych składowych. By otrzymać rzeczywisty rozmiar obiektu, włączając w to zmienne składowe tego obiektu, należy użyć polecenia !objsize <adres>.

Zmienne składowe same są obiektami na stercie, zatem w wyniku polecenia !dumpheap –stat zostaną one wykazana osobno, a w naszym przypadku, zagregowany rozmiar 1 032 127 612 bajtów, jest rzeczywistym rozmiarem wszystkich obiektów na stertach.

Niektóre typy, jak string, byte[] czy char[], zawierają rzeczywiste dane w strukturze, co oznacza że całkowity rozmiar wykazany przez !dumpheap -stat, będzie taki sam lub bardzo zbliżony do całkowitego rozmiaru obiektów. Z tego powodu oraz z powodu bycia popularnymi typami, w większości przypadków będziemy widzeli je w roli największych okupantów pamięci. W związku z tym, w przypadku poszukiwania wycieków pamięci, bardziej pomocnym może być szukanie wśród obiektów występujących nieco rzadziej.

W rozważanym przypadku możemy zauważyć ogromną ilość obiektów typu DataRow, zatem dobrym punktem początkowym byłoby znalezienie przyczyny tak dużej ich ilości.

Duża ilość stringów prawdopodobnie jest składową obiektów DataRow, których na stercie zaalokowano 570.274. Biorąc pod uwagę 221 DataSet’ów, każdy z nich średnio zawiera 2.580 wierszy, co oznacza że są to duże DataSet’y. By tego dowieść, moglibyśmy sprawdzić wielkość kilku wybranych, używając do tego polecenia !objsize.

Kolejną ważną rzeczą są obiekty raportowane jako Free. Nie są to obiekty, a pamięć zwolniona podczas odśmiecania, której jeszcze nie scalono (not compacted). Pamięć ta może być wykorzystana do kolejnych alokacji. Jeżeli zauważymy dużą ilość wpisów reprezentujących wolną pamięć na stercie (Free), możemy mieć do czynienia z problemem przypinania (pinning) obiektów. Precyzując, możemy przyjąć regułę, że jeżeli 30% pamięci na stercie jest raportowana jako wolna (Free), istnieje duże prawdopodobieństwo występowania powyższego problemu, którego dobre wyjaśnienie możemy znaleźć na blogu Moani, pod adresem http://blogs.msdn.com/maoni.

Innymi, przydatnymi przełącznikami są:

-mt zwraca obiekty o wskazanej tabeli metod
-type zwraca obiekty których nazwa pasuje do podanego wzorca
-min zwraca wszystkie obiekty, których rozmiar przekracza podany
-fix zwraca wszystkie obiekty znajdujące się pomiędzy dwoma adresami w pamięci
-l <liczba> zwraca tylko określoną ilość obiektów, podaną w <liczba>

Powyższe przełączniki możemy ze sobą łączyć, np.:
!dumpheap -type String -min 85000
zwróci nam wszystkie obiekty typu String, zaalokowane na stercie dla dużych obiektów (LOH). Rozmiar 85 000 bajtów jest wielkością, która powoduje że obiekt jest alokowany na LOH, zamiast na zwykłej stercie.
Przykładowym rezultatem powyższego polecenia będzie:

0:067> !dumpheap -type String -min 85000
Using our cache to search the heap.
Address    MT           Size     Gen
0x212d0030 0x79b94638   86,812   -1 System.String dDwtMTE0NjcyOTQ4MTt0PDtsPGk8Mz
0x222d0030 0x79b94638   86,812   -1 System.String dDwtMTE0NjcyOTQ4MTt0PDtsPGk8Mz
0x232d0030 0x79b94638   86,688   -1 System.String dDwtMTE0NjcyOTQ4MTt0PDtsPGk8Mz
Statistics:
        MT      Count     TotalSize Class Name
0x79b94638          3       260,312 System.String
Total 3 objects, Total size: 260,312

Oznacza to że na LOH znajdują się 3 stringi, o wielkości odpowiednio 86 812, 86 812 i 86 688 bajtów, reprezentujące tekst o długości około 40 000 znaków, ponieważ każdy znak w .net jest kodowany przy użyciu 2 bajtów (unicode).

Uwaga: ostatnia kolumna wyniku powyższego polecenia, zawiera kilkanaście pierwszych znaków stringu. Warto wiedzieć że stringi zaczynające się od znaków „dDw” są strigami kodowanymi Base64. W większości przypadków, widząc takie stringi, możemy spodziewać się że reprezentują one viewstate. W rozważanym przykładzie, analizowany proces zawiera strony ASP.net o viewstate znaczącej wielkości.

opublikowano przez Bysza | 2 komentarzy
Filed under: ,

WinDbg – od czego zacząć?

Zanim przystąpimy do analizy przypadków publikowanych przez Tess Ferrandez, myślę że przyda nam się wprowadzenie do konfiguracji i podstawowego użycia WinDbg.

W naszych rozważaniach będziemy zajmować się debugowaniem aplikacji zaimplementowanych w kodzie zarządzanym, działających w trybie użytkownika. Debugowanie programów działających w trybie jądra, np. sterowników, jest poza zakresem.

Konfiguracja WinDbg

1. Pobrać i zainstalować aktualną wersję WinDbg 32bit lub 64bit.

2. Założyć folder przeznaczony na pliki symboli, np. c:\debugging\symbols.

3. Zadeklarować globalną zmienną środowiskową o nazwie _NT_SYMBOL_PATH i przypisać jej wartość „srv*c:\debugging\symbols*http://msdl.microsoft.com/download/symbols”.
lub
Uruchomić WinDbg i wejść do menu "File -> Symbol File Path" i wpisać tam powyższą ścieżkę do symboli.

4. Jeżeli to wymagane, ustawić folder zawierający kod źródłowy w menu "File -> Source File Path."

Powyższa lista w żadnej mierze nie wyczerpuje dostępnych możliwości konfiguracyjnych, lecz pozwala szybko ustawić najbardziej potrzebne opcje i przystąpić do debugowania.

Debuger

Reguły nazewnictwa komend debugera

Polecenia

Standardowe polecenia debugera zwykle zaczynają się od litery, ale mogą również od innych znaków. Służą do kontroli pułapek, przeglądania pamięci, kontroli wątków debugowanego procesu, itp.

Metapolecenia

Zawsze rozpoczynają się od znaku „.” (kropki) i służą do sterowania debugerem, np.: .load ładuje bibliotekę rozszerzeniową do aktywnej sesji debugera.

Polecenia rozszerzone

Zawsze rozpoczynają się od znaku „!” (wykrzyknik). Zaimplementowane i udostępnione przez biblioteki rozszerzeniowe, np. SOS.dll.

Debugowanie

WinDbg umożliwia dwie metody debugowania aplikacji zarządzanych: załadowanie pliku zrzutu lub podłączenie do procesu.

Pliki zrzutu (crash dump)

Plik zrzutu zwykle tworzony jest w przypadku wystąpienia nieobsługiwanego wyjątku (Dr Watson 2) lub na żądanie użytkownika. Vista umożliwia utworzenie zrzutu procesu bezpośrednio z Task managera. W innych systemach lub bardziej zaawansowanych przypadkach (np. zrzutu warunkowego), należy użyć jednego z narzędzi pomocniczych jak ADPlus (http://support.microsoft.com/kb/286350) lub DebugDiag dla IIS (http://support.microsoft.com/kb/931370).

Podłączanie do procesu

W przypadku gdy nasza aplikacja jest już uruchomiona, podobnie jak w Visual Studio, możemy podłączyć się debugerem do procesu.

Wyróżniamy tutaj dwa tryby debugowania: inwazyjny i nieinwazyjny.

Tryb inwazyjny wykorzystuje Win32 Debugging API. Pozwala na przejęcie pełnej kontroli nad działaniem aplikacji i użycie wszystkich dostępnych poleceń debugera.

Tryb nieinwazyjny nie powoduje podłączenia się do procesu przy użyciu Win32 Debugging API, tylko wstrzymanie wykonania wszystkich wątków aplikacji i uzyskanie dostępu do pamięci procesu. Ten tryb ma minimalny wpływ na aplikację i jest przydatny np. w przypadku potrzeby podejrzenia aktualnego stanu wykonania, a następnie kontynuacji działania aplikacji. Udostępnia ograniczony zestaw poleceń debugera.

Podłączamy się do procesu poprzez „File -> Attach to process” lub klawisz F6 i wybór procesu który nas interesuje. Debuger domyślnie przyjmuje tryb inwazyjny – by skorzystać z trybu nieinwazyjnego, należy zaznaczyć checkbox „Noninvasive”.

Odłączenie od procesu realizuje polecenie „Debug -> Detach debuggee” lub „Debug -> Stop debugging.”

Wbudowany help i inne przydatne polecenia

Rozszerzenie Son of Strike (SOS) jest przeznaczone do interpretacji struktur zarządzanych przez CLR.

Każdy proces .net na wstępie swojego działania, rozwiązuje wersję CLR, którą powinien załadować i ją ładuje. SOS jest powiązany z określoną wersją .net, dlatego zanim przystąpimy do jego ładowania do debugera, należałoby ustalić jaką wersję CLR mamy w debugowanym procesie i jaka jest ścieżka do właściwej wersji SOSa. Jest to nieco uciążliwe, dlatego polecenie:

.loadby sos mscorwks

ładuje SOS do debugera, bazując na ścieżce obrazu biblioteki mscorwks (czyli CLRa), znakomicie upraszczając sprawę. Oczywiście do procesu mogła również zostać załadowana biblioteka mscorsvr…

!help

Wyświetla listę poleceń dostępnych w SOS.

!help [nazwa polecenia]

Wyświetla dokumentację wskazanego polecenia, np. !help GCRoot.

W następnym poście skupimy się na kilku najbardziej przydatnych poleceniach SOS, podłączymy się do małej, przykładowej aplikacji i obejrzymy ją sobie w WinDbg.

opublikowano przez Bysza | 0 komentarzy
Więcej wypowiedzi Następna strona »