visual studio

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