Development z Zapomnianej Strony

..:: Paweł Hofman .NET Portal ::..

 

Watch Window Debugowanie i podglądanie wartości zmiennych w oknie Watch, często byłoby dużo wygodniejsze, gdyby dane można rzutować na inne typy oraz poddawać je innym manipulacjom. Na szczęście prócz wymuszenia zmiany typów, okno to posiada wbudowany zestaw predefinowanych formatów, które mogą pobierać dane ze znanych typów wyliczeniowych (Windows Messages lub Code Errors) lub po prostu odczytywać napisy ANSI / UTF-16, bądź traktować dane jako tablice o zadanej wielkości, podając wartości wszystkich elementów. Wpisujemy je po przecinku na końcu wyrażenia, np.:

  • lpszFileName, su --> spowoduje wyświetlenie zawartości zmiennej jako tekstu UTF-16
  • dwMessage, wm  --> wyświetli zadaną liczbę jako kod Winows Message (WM_CREATE, …)
  • index, x  –-> wyświetli liczbę w trybie hexadecymalnym
  • (char *)lpszDeviceName, 10  --> wyświetli 10 pierwszych znaków napisu

Dla C++ ten zestaw formatów przedstawia się następująco:

Nazwa formatu Opis działania Przykładowe wyrażenie Wyświetlane
d, i signed decimal integer 0x1122FF, d  
u unsigned decimal integer 0x11, u  
o unsigned octal integer    
x, X hexadecimal integer    
l, h przedrostek long/short dla: d, i, u, o, x, X    
f signed floating point    
e signed scientific notation    
g signed floating point lub signed scientific notation w zależności od tego, który jest krótszy    
c single character    
s string    
su Unicode string 0x023571FA, su  
hr HRESULT 0x00000000L, hr S_OK
wc flagi Windows Class 0x00000040, wc WC_DEFAULTCHAR
wm numery komunikatów Windows Message 0x0001, wm WM_CREATE
! raw format, usuwa wszystkie informacje o typie    

 

Nazwa formatu Opis działania Przykładowe wyrażenie
ma 64 ASCII characters lpData, ma
m 16 bytes in hexadecimal, followed by 16 ASCII characters lpData, m
mb 16 bytes in hexadecimal, followed by 16 ASCII characters lpData, mb
mw 8 words lpData, mw
md 4 doublewords lpData, md
mq 2 quadwords lpData, mq
mu 2-byte characters (Unicode) lpData, mu

 

Tak samo i w programach w języku C# formaty przestawiają się:

Nazwa formatu Opis działania Przykładowe wyrażenie Wyświetlane
d decimal integer 0x64 100
h hexadecimal integer 11 0xB
nq string without quotes “Sample Text” Sample Text
private Wyświetla prywatne zmienne obiektu.    
raw Wyświetla dane własne obiektu. Poprawne tylko dla typów pośredniczących (proxy).    
Ac Wymusza wyliczanie wartości wyrażeń (przydatne gdy wyliczanie wartości i właściwości jest wyłączone).    

 

Jako ostatnie chciałem przestawić pseudo-zmienne, które pokazują charakterystyki uruchamianej aplikacji:

Pseudo-zmienna Opis działania
$handles Wyświetla liczbę zaalokowanych uchwytów (HANDLE) aplikacji.
$vframe Wyświetla adres aktualnej ramki stosu (stack frame).
$TID Wyświetla ID aktualnego wątku.
$ENV Wyświetla rozmiar środowiska przekazanego podczas uruchamiania aplikacji.

Próba edycji tej wartości wyświetli wszystkie zmienne środowiskowe w oknie Output, bez wykonania jakiejkolwiek zmiany.
$CMDLINE Wyświetla rozmiar linii poleceń, którą uruchomiono program.

Próba edycji wartości wyświetli wartość tekstową tej linii w oknie Output, bez jakiejkolwiek zmiany.
$registername
        or
@registername
Wyświetli zawartość rejestru o zadanej nazwie.
$clk Wyświetli aktualny czas w cyklach.
$user Wyświetli informacje o koncie użytkownika, z którego uruchomiono aplikację.
$exception (C#, VB.NET, F#) Wyświetli informacje o ostatnim wyjątku.

 

Więcej informacji można znaleźć w MSDN (o C++ tutaj, o C# tutaj).



Program KeePass Password Safe ma tę niefortunną dla języka polskiego uciążliwość, iż domyślnie przechwytuje on wszystkie naciśnięcia klawisza ‘Ctrl+Alt+A’ (kilku innych również) w całym systemie i wykorzystuje do swoich akcji. Powoduje to niemożność  napisania literki ‘ą’ w jakiejkolwiek aplikacji.

Na szczęście da się to zmienić poprzez: Narzędzia –> Opcje –> Zaawansowane –> tutaj przycisk Auto-Type na dole ekranu. Wybieramy mniej uciążliwy skrót i po sprawie!



Kolejny sposób jak zmarnować sobie kilka wieczorów – to próba konfiguracji trybu dual-boot w bootloaderze Windows Vista, tak aby uruchamiał on Vistę 64-bitową albo XP 32-bitowego (i może jakiś inny w przyszłości). Każdy z tych systemów jest zainstalowany na osobnym dysku twardym na pierwszej partycji. Jest ona zawsze aktywna i rozpoznawana jako dysk C:, gdy startuje system. Mam nadzieję, że jeśli przeczytasz mój dalszy wywód to również dojdziesz do przekonania, że szkoda marnować czas na próbę spięcia tych systemów razem. A rozwiązanie jest banalne. Przynajmniej na tej płycie głównej wystarczy podczas uruchamiania komputera, gdy Bios wyświetla dostępną ilość pamięci, procesor itp., wcisnąć klawisz F8. Wyskoczy po chwili przyjemne menu, z którego wybierzemy sobie bez wchodzenia do ustawień Biosu dysk, z którego wystartować maszynkę.

Niestety Windows XP wykorzystuje do uruchamiania ntldr oraz boot.ini, gdzie zdefiniowane są ewentualne odniesienia do innych systemów operacyjnych. Visty niestety nie potrafi uruchomić, niezależnie od tego, co wpiszemy do tego pliku.

Z drugiej strony bootloader Visty potrafi obsługiwać ładowanie bootloadera Windows XP poprzez tryb zgodności zdefiniowany dla elementu “{ntldr}”. Jednak w moim przypadku za każdym razem takie uruchamianie kończyło się czarnym ekranem oraz restartem komputera.



Moje usilne starania wreszcie zostały uwieńczone sukcesem. Pragnę tym samym szybko donieść, iż możliwa jest instalacja Windowsa XP Professional (SP3) 32-bit na komputerze opartym o płytę główną ASUS P5Q Deluxe z zamontowanymi dyskami twardymi oraz czytnikiem DVD wyłącznie na interfejsie SATA2. Nie oznacza to, że jest to proste :)

Podczas swojej walki z całym tym badziewiem napotkałem problemy następującej natury, zatem jeśli mierzysz się z nimi, to może ten wpis jest właśnie dla Ciebie:

  • Blue Screen Of Death 0x0000007B podczas instalacji Windowsa
  • Blue Screen Of Death 0x00000074, który również tyle mówił, co nic
  • oraz brak stacji dyskietek w komputerze, aby zainstalować sterowniki do RAID/AHCI.

Oczywiście dwa pierwsze błędy i wysypki instalatora tuż po załadowaniu kilku plików z płyty wskazywały, że jest to problem z dyskami (a dokładniej z obsługą ich kontrolera). Niestety Windows XP ma to niefortunne ograniczenie, że sam z siebie nie obsługuje dysków SATA/SATA2/RAID w ogóle i chwali się tym dumnie poprzez krytyczne ostrzeżenia. Należy mu odpowiednie sterowniki podać wciskając klawisz F6 na samym początku procesu instalacji. Asus na swojej stronie z pomocą dostarcza te pliki (łącznie 6, zajmujących w sumie około 360kB) jako archiwum o nazwie ICH10R_AHCIRAID_XPVista.zip. Teraz właśnie spotykamy finalny mur. Żadna tyczka już tu nie pomoże, a jedynie twarda głowa, bo oto właśnie pliki te trzeba podać na niczym innym jak tylko na zwykłej dyskietce (ciekawe czy ktoś jeszcze kupuje stacje dyskietek).

Ponieważ tak zaawansowanym sprzętem nie dysponuję, podszedłem do tego inaczej. Mianowicie należało w tym celu ‘oszukać’ Windowsa poprzez odpowiednie ustawienia Biosu (v02.61, 2005), które powodują, że zamiast SATA widzi on zwykłe dyski na IDE (PATA):

  • SATA configuration - [Enhanced]
  • Configure SATA as - [IDE]

Oba ustawienia są ważne, aby próba instalacji tym razem się powiodła. Wszystko będzie grzmieć i buczeć, ale jedna rzecz przecież nie daje spokoju. Dlaczego super dyski SATA2 mają chodzić w emulowanym trybie IDE. Zgodzę się, że to zupełnie nielogiczne…

Dlatego zaraz po ukończeniu instalacji zalecam dodanie do systemu następujących sterowników:

  1. Marvell 61xx, aby dodać obsługę dysku DriveXpert (opcjonalnie, bo może wydłużyć czas ładowania się systemu)
  2. Intel Matrix Storage Manager dla chipsetu P45 (doda obsługę gniazd SATA2 przez mostek północny naszej płyty głównej)
  3. oraz całą masę innych sterowników do karty muzycznej, graficznej i sieciowej…

Od tej pory można ponownie w Biosie przestawić dyski tak, aby pracowały w trybie SATA2.

Uwaga końcowa – Vista x64-bit nie ma żadnego z tych problemów i można realnie zaoszczędzić trzy wieczory, zamiast spędzać je na rozwiązywaniu nieistniejących problemów.

Również jeśli instalator XP w drugiej fazie ciągle wysypuje się z błędem BSOD 0x000000F4, to należy sprawdzić, czy dysk, na który instalujemy system jest typu ‘master’ i podłączony do głównego kontrolera. U mnie pomogło po prostu wyciągnięcie wszystkich zworek z dysku. Odsyłam również do:



Autor

Paweł Hofman [CodeTitans]

ASP.NET
C/C++, C#, Objective-C
SQL

License and Disclaimer

Moje Gry i Aplikacje

Zobacz mnie na GoldenLine

Zobacz mnie na LinkedIn
Supported by Polish SQL Server User Group (PLSSUG)

Supported by WrocNet.org

Zine.net.pl

Wpisy

Projekty

Moje projekty open-source:

Sign in