Tag Archive for 'debug'

W poszukiwaniu błędu

Pewnego chłodnego jesiennego dnia zdarzyło mi się doświadczyć bardzo niemiłej niespodzianki ze strony nowo zakupionego komputera. Był to świeży, jeszcze ciepły komputer Dell Optiplex 740, wprost z Limerick, na którym zainstalowałem Windows Server 2003 R2 EE z zamiarem wykorzystania pudełka jako hosta do wirtualnych maszyn działających na Virtual Server 2005 R2.

Instalacja systemu, konfiguracja, później instalacja VS przebiegły bez zakłóceń. Dopiero, gdy zacząłem instalować pierwszego gościa na serwerze wirtualnym, mój komputer znieruchomiał. Nie reagował na żadne klawisze, myszka zastygła bez ruchu tam gdzie ją zostawiłem, tzw. stan zamrożenia (freeze).

Powtórzyłem więc operację w celu otrzymania chociaż BSOD (Blue Screen Of Death, czyli po polsku niebieski ekran). Znów ta sama reakcja. Powtórzyłem próbę jeszcze kilka razy wciąż bez spodziewanego niebieskiego ekranu błędu. Zacząłem szukać po Intra- i Internecie materiałów na podstawie których mógłbym zlokalizować błąd. Niestety rozrzut tematyki był na tyle duży, że aż nieprzydatny.

Eliminując z łamigłówki poszczególne klocki układanki postanowiłem zainstalować gościa na Virtual PC 2007. Efekt był dokładnie ten sam - zamrożenie systemu. Wypadło jeszcze kilka innych czynników, łącznie ze sprzętem - klawiatura, myszka, inne urządzenia USB; wyeliminowanie systemu operacyjnego już nie było takie proste.

Zainstalowałem Windows Vista Enterprise i Virtual PC 2007. Za pierwszym razem efekt był podobny do tego otrzymanego na Windows Server 2003, ale już za drugim podejściem dostałem to, czego szukałem - BSOD.

Oto wycinek z windbg:

BugCheck 101, {61, 0, 8a4c7120, 1}
PEB is paged out (Peb.Ldr = 7ffd300c).  Type “.hh dbgerr001″ for details
PEB is paged out (Peb.Ldr = 7ffd300c).  Type “.hh dbgerr001″ for details
Probably caused by : ntkrpamp.exe ( nt!KeFlushProcessWriteBuffers+5f )
Followup: MachineOwner

Dalsza analiza z użyciem !analyze -v pokazała mi już nieco więcej szczegółów:

CLOCK_WATCHDOG_TIMEOUT (101)
An expected clock interrupt was not received on a secondary processor in an
MP system within the allocated interval. This indicates that the specified
processor is hung and not processing interrupts.
Arguments:
Arg1: 00000061, Clock interrupt time out interval in nominal clock ticks.
Arg2: 00000000, 0.
Arg3: 8a4c7120, The PRCB address of the hung processor.
Arg4: 00000001, 0.

I dalej:

PEB is paged out (Peb.Ldr = 7ffd300c).  Type “.hh dbgerr001″ for details
PEB is paged out (Peb.Ldr = 7ffd300c).  Type “.hh dbgerr001″ for details
DEFAULT_BUCKET_ID:  VISTA_DRIVER_FAULT
BUGCHECK_STR:  0×101
PROCESS_NAME:  SearchProtocolH
CURRENT_IRQL:  1c
LAST_CONTROL_TRANSFER:  from 81828448 to 818d85c9

STACK_TEXT:  
[cut] nt!KeBugCheckEx+0×1e
[cut] nt!KeUpdateRunTime+0xd4
[cut] nt!KeUpdateSystemTime+0xed
[cut] nt!KeFlushProcessWriteBuffers+0×5f
[cut] nt!KeSetPriorityAndQuantumProcess+0×6a
[cut] nt!PsSetProcessPriorityByClass+0×20
[cut] nt!NtSetInformationProcess+0×219
[cut] nt!KiFastCallEntry+0×12a
WARNING: Frame IP not in any known module. Following frames may be wrong. 
[cut]

STACK_COMMAND:  kb
FOLLOWUP_IP:
nt!KeFlushProcessWriteBuffers+5f
81811c63 8b08            mov     ecx,dword ptr [eax]
SYMBOL_STACK_INDEX:  3
SYMBOL_NAME:  nt!KeFlushProcessWriteBuffers+5f
FOLLOWUP_NAME:  MachineOwner
MODULE_NAME: nt
IMAGE_NAME:  ntkrpamp.exe
DEBUG_FLR_IMAGE_TIMESTAMP:  4549ae00
FAILURE_BUCKET_ID:  0×101_nt!KeFlushProcessWriteBuffers+5f

Pozwoliłem sobie powycinać co dłuższe kawałki z powyższego tesktu z windbg dla jasności obrazu.

Poszukałem co to takiego jest ten bugcheck 0×101: The specified processor is not processing interrupts. Typically, this occurs when the processor is nonresponsive or is deadlocked.

Procesor nie odpowiadał? Z uwagi na już drugi sprawdzany system operacyjny, wyglądało to dla mnie całkiem sprzętowo. Nie pierwszy i zapewne nie ostatni raz widziałem nowe komputery (serwery) z błędami sprzętowymi. Niestety nie miałem okazji sprawdzić tego zachownia na innych Optiplexach 740 z identyczną konfiguracją, ale postanowiłem szukać szczęścia na stronach pomocy technicznej Della, mojego poprzedniego pracodawcy.

Niespodziewanie okazało się, że istniała nowa wersja BIOSu, która uaktualniła wersję 1.1.8 do 1.2.2. Z samych cyferek widać, że to dość duży skok.

Zainstalowałem nową wersję BIOS’u i … jak ręką odjął. Na nowym komputerku już działają sobie dwie maszyny wirtualne radośnie komunikując się między sobą.

Nie po raz pierwszy byłem cierpliwy w poszukiwaniu błędu, choć tym razem moja cierpliwość była posunięta do granic. Niestety Dell nie precyzuje dokładnie w czym różniła się nowa wersja BIOS’u od pozostałych poza ulepszeniem kompatybilności z niektórymi urządzeniami USB i poprawnieniem zarządzania energią. Jeśli jednak to był problem z USB, to zastanawiające czemu błąd rodził się tylko podczas instalacji maszyn wirtualnych? Jeśli ktoś drążył ten temat głębiej, chętnie postiuduję materiał.

Prostota

Czasami po chwili refleksji dochodzimy do wniosku, że siła i jakość prostoty jest tak wielką przewagą nad bogactwem mnogich rozwiązań, że porzucamy w kąt 10 skomplikowanych technik by skorzystać z jednej, może niekoniecznie najłatwiejszej, ale skutecznej. To tak jak do wszystkich fragmentów teksu używać Word’a, kiedy notatnik otwiera się szybciej i zajmuje mniej pamięci.

Prostota rozwiązań ma jeszcze jedną ważną zaletę: w 10 systemach istnieje 10 możliwych punktów awarii, każda jedna powoduje całkowitą awarię. Przy jednym jest choćby mniej debugowania.

To zupełnie jak ze zdjęciem. Może to być zdjęcie HDR, gdzie ważna jest gama kolorów i każdy jeden szczegół obrazka, a może to być po prostu jedna linia i jakaś ciekawa faktura. I właśnie piękno takiego zdjęcia polega na jego prostocie.

a line

Skype już nie czyta BIOS’u

Wraz z nową wersją popularnego komunikatora wyjaśniła się mała afera z pobieraniem danych z BIOS’u. Pozwolę sobie na odrobinę polemiki z twórcami programu, cytuję za stroną skype.com:

It is quite normal to look at indicators that uniquely identify the platform and there is nothing secret about reading hardware parameters from the BIOS. The function calls to do this are public and are available to any software running on your computer.

Powyższe jest prawdziwe dla Windows x86, ale już nie x64 (obługa NTVDM). Oczywiście, nie ma nic zdrożnego w czytaniu numeru płyty głównej, jeśli wyjaśnia się użytkownikowi, że taka czynność będzie miała miejsce. Skype zabrał się do tego wyjątkowo amatorsko: najpierw użył, wywołał aferę, a później wyjaśnił.

A wyjaśnienie jest takie:

One of the new features in Skype for Windows is the Extras Gallery. (Extras are third-party plug-ins that let users expand Skype functionality. See extras.skype.com for what’s available). The Gallery is managed by a plug-in manager software framework developed by EasyBits Software and used under license.

The EasyBits software includes a form of digital rights management functionality intended to protect commercial software, such as plug-ins, from illegal redistribution or unlicensed use. Simply put, the EasyBits DRM framework helps us ensure compliance with software usage and distribution.

Czyli znów rzecz o nieszczęsnych DRM‘ach. Wszyscy wiedzą, że DRM się nie sprawdził, choć nikt (jeszcze) nie wymyślił innego skutecznego systemu ochrony wartości intelektualnej. Ale dalej, Skype poszedł z duchem idei, jaką podniósł zarówno Steve Jobs jak i Bill Gates:

Since we learned that EasyBits DRM did not perform well on some newer platforms, we updated the version of their framework with one that no longer attempts to read from the BIOS.

Wytłumaczenie dość zawoluowane: ponieważ nie działa na wszystkich komputerach, szczególnie tych nowszych, to my schowamy zabawki i nie będziemy się więcej tak bawić. Nice try!

Przypadek Skype’a wręcz zmusza do zadania pytania: ile jest jeszcze programów, które bez naszej wiedzy wykorzystują jednoznacznie identyfikujące dane (takie jak adres MAC, IP, numer płyty głównej) do swoich potrzeb? Na pewno robi to Microsoft - w procesie aktywacji, ale o tym przynajmniej jesteśmy informowani. Ile jest takich programów, które dopiero kiedy zaczną sprawiać problemy przykują naszą uwagę swoim działaniem?

Polecam Dziennik Internautów: Nowy Skype już nie pobiera danych z BIOSu

Skype czyta BIOS i numer płyty głównej?

Na blogu pagetable.com autor myria opisał przypadek Skype’a, który na systemie 64-bitowym spowodował błąd wyglądający mniej-więcej tak:

The program or feature “\??\C:\Documents and Settings\Myria\Local Settings\Temp\12\1.com” cannot start or run due to incompatibility with 64-bit versions of Windows. Please contact the software vendor to ask if a 64-bit Windows compatible version is available.

Po dalszym śledztwie okazało się, że programik 1.com próbował odczytać BIOS i numer seryjny płyty głównej i przekazać te dane do głównego programu. Autor pyta: po co?

Ja też zapytam po co? W celu identyfikacji użytkownika? Zabezpieczenia użytkowników przed kradzieżą nazw użytkowników i ochrony ich pieniędzy na koncie SkypeOut? Jakiekolwiek są powody takiego postępowania wydaje mi się to trochę nie fair, że Skype i tym nie informuje!

A sprawa wyszła tylko dlatego, że Windows x64 nie posiada NTVDM - 16-bitowego systemu (obecnego w Windowsach od Windows NT aż po Vistę). W systemach 32-bitowych NTVDM zezwala na dostęp do odczytu danych z BIOS.

Nowa wersja Debugging Tools

21 stycznia ukazała się nowa wersja niezbędna każdemu administratorowi (w szczególności Pomocy Technicznej) Windows Debugging Tools 6.4.7.2. (Co nowego w nowej wersji?)
Do czego służy Windows Debugging Tools?
Windows Debugging Tools służy do debugowania aplikacji, driverów i usług w środowisku Windows. Narzędzie obsługuje wszystkie 32-bitowe proccesory x86, Intel Itatnium i platformę x64. Działa na Windows Nt, 2000, XP, 2003 Server i Longhorn.
Więcej szczegółów można znaleźć na Debugging Tools and Symbols: Getting Started.

Jak używać debuggera?
Najpierw musisz go skonfigurować, by korzystał z bazy symboli dostępnych na serwerze Microsoft (SRV*c:websymbols*http://msdl.microsoft.com/download/symbols, więcej na Debugging Tools and Symbols: Getting Started).
Jeśli twój komputer/serwer zrestartował się samoistnie lub dostałeś blue-screen (BSOD), powinienieś znaleźć w c:windowsminidump (c:winntminidump) pliczek wielkości 64kb. Uruchom WinDBG, Ctrl-D, wybierz plik. Jeśli chcesz więcej szczegółów napisz !analyze -v i wciśnij Enter (oczywiście zależy jakiego systemu operacyjnego używasz, jak skonfigurowany jest twój system jeśli chodzi o zrzuty pamięci).
Debugowanie to duża sprawa, opisanie choćby fragmentu na tej stronie zajełoby kilka linijek - nie ma sensu powtarzać tego, co już zostało napisane.

Najlepsze źródło wiedzy:
Debugging Tools and Symbols: Getting Started
Install Debugging Tools for Windows 32-bit Version
Download Windows Symbol Packages
Debugging documentation

Jeśli masz problemy z analizą swojego pliku dump, zwróć się do polskiego oddziału Pomocy Technicznej Microsoft.

Źródło: Bink.nu, Microsoft Hardware and Driver Central




Disclaimer

All postings are provided "AS IS" with no warranties, and confer no rights. This weblog does not represent the thoughts, intentions, plans or strategies of Microsoft or any other company or organization. Because a weblog is intended to provide a semi-permanent point-in-time snapshot, you should not consider out of date posts to reflect current thoughts and opinions.
All software used by author of this blog come from legal sources.

Add to Technorati Favorites