Data Breakpoint w Visual C++

Co to jest breakpoint (pułapka) wie każdy, nawet początkujący programista. Przerwanie wykonywania programu w momencie osiągnięcia pewnego miejsca jest niezwykle przydatne w trakcie debugowania – zwłaszcza kiedy program wywala się z niewiadomych powodów. Najczęściej wykorzystywane w Visual Studio są zwyczajne breakpointy wstawiane poprzez kliknięcie na lewym marginesie kodu. W dzisiejszym wpisie zajmę się drugim rodzajem dostępnym w wersji Express (2008). Są to Data Breakpoint, które nawiasem mówiąc pomogły mi ostatnio znaleźć pewien błąd który wydawałoby się brał się  znikąd.

Tak więc czym są owe Data Breakpoints? W przeciwieństwie do swoich „standardowych” kolegów nie zatrzymują wykonywania programu po osiągnięciu określonego miejsca, lecz w przypadku kiedy określony obszar pamięci ulega zmianie. Jak to działa? Posłużmy się prostym programem:

#include <iostream>

int g_Fred = 0;

void DoSomeBoringThings();

int main()
{
	std::cout << "Fred should be equal to Wilma\n";
	for(int Wilma = 0; Wilma < 10; Wilma++)
	{
		DoSomeBoringThings();
		std::cout << "Wilma equals " << Wilma << " and Fred equals " << g_Fred++ << "\n";
	}
	std::cin.get();
}

void DoSomeBoringThings()
{
	//some boring code
	++g_Fred;
	//some code written by a bored programmer
}

Program jest bardzo prosty i nie robi nic konkretnego więc skupmy się tylko na tym co istotne dla naszych rozważań. W funkcji DoSomeBoringThings modyfikujemy zmienną globalną. Jednak w pętli programista oczekuje że g_Fred nie zmienia się nigdzie ‚za kulisami’. Oczywiście w tak krótkim programie widać jak na dłoni co się dzieje, ale w większych projektach może być trudno znaleźć miejsce gdzie jakaś zmienna jest niespodziewanie modyfikowana. Tu z pomocą przychodzi nam tytułowe narzędzie, pozwalające zatrzymać program przy okazji modyfikowania fragmentu pamięci (więc także zmiennej). Jak tego użyć? Stawiamy zwyczajny breakpoint na początku funkcji main i uruchamiamy debugowanie. Kiedy program się zatrzyma zaznaczamy naszą zmienną (g_Fred) i wybieramy Debug->New Breakpoint->New Data Breakpoint… Pojawi nam się okno dialogowe New Breakpoint

W pole Addres wpisujemy adres pamięci, możemy użyć też wyrażenia z operatorem & (tak jak zrobiliśmy to w tym przykładzie). Byte Count oznacza ile bajtów od danego adresu mamy śledzić (przykładowo jest to 4 gdyż g_Fred jest typu int). Po wznowieniu, program zatrzyma się i zostaniemy przeniesieni w miejsce modyfikacji zmiennej.

Jak widać jest to nieskomplikowane narzędzie, jednakże może okazać się przydatne.

P.S. Post z jednodniowym poślizgiem, ale lepsze to niż wrzucenie wypełniacza tylko po to aby zmieścić się w zakładanym terminie.

Reklamy

9 comments

  1. Hehe i bardzo dobrze. Im więcej powiązanych blogów, tym większa oglądalność.

    Btw. co do mojego bloga to musicie się trochę jeszcze wstrzymać. Okazało się że brakuje odpowiednich komponentów (system komentarzy, ściągalnia) dla tej wersji j1.6. Możliwe że jeszcze kilka dni blog może być niedostępny… Ale zobaczymy ;).

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s