Debugger w MS Visual 2008 C++ Express

siemka wszystkim, mam takie pytanie odnosnie debuggera w środowisku Visual 2008 C++ express. mianowicie, C++ sie bawie już od dłuższego czasu, a o debuggerze, wiem tylko tyle, że zgodnie z wikipedią - odnajduje błędy w kodzie źródłowym. mam odnośnie jego kilka pytań:

  1. napisałem specjalnie błędny kod i zaznaczyłem opcję w visualu Start Without debugging - na dole ekranu i tak pojawiły mi się błędy, które celowo umieściłem. Jak to możliwe, że bez debuggera wyświetliło mi błędy - przeciez to on je szuka, a ja go teraz wyłączyłem :?:

  2. do czego może się przydać debugger początkującemu programiście (oprócz wyswietlania błedów) :?: wiem, że można zastawiać tam np. breakpointy itp., ale jakoś jeszcze nigdy tego nie używałem. znacie jakiś dobry przykład (i w miarę prosty), na którym można by wykorzystac mozliwości tego odpluskiwacza :?:

  3. czytam o C++ w Symfonii, i tam autor wspomina ciągle, że dzięki debuggerowi można śledzić pracę programu linijka za linijką. czy ktoś wie jak to można osiągnąć w IDE Microsoftu :?:

będę bardzo wdzięczny za waszą pomoc :wink:

Debuger działa wtedy, kiedy np wykroczysz poza zaadresowaną pamieć.

Np spróbuj czegoś takiego

bool aTablica [2];

aTablica [3] = 0;

Skompiluj to i uruchom z debuggerem a potem bez debuggera :wink:

Również mam pytanie co do debugera, można go uruchomić wtedy, gdy np nie spowodujemy wykroczenia pamięci ?

Możesz podłączyć się pod proces, spauzować wykonywanie programu, postawić breakpoint w oknie IDE, przerwać działanie programowo(przerwanie nr 3, DebugBreak, System.Diagnostics.Debug.Break) i przypuszczam, że to nie jedyne sposoby.

O dzięki :wink:

OK, a powracając do moich 3 pytań :?:

Przecież dostałeś już odp.

  1. Debugger nie sprawdza poprawności składniowej (chyba to niezbyt po polsku xD) a pomaga znaleźć błędy w funkcjonowaniu programu

Na pkt 2,3 dostałeś już odp w mojej poprzedniej wypowiedzi.

Odnośnie twojego pierwszego postu, to uruchomiłem ten program potem bez debuggera i też wyświetlił mi się błąd (run-time coś tam…), tyle, że w nieco innym okienku - ale treść była taka sama jak przy uruchomieniu z debuggerem.

Odnośnie punktu 2) to chciałbym - jak już mówiłem - zobaczyc jakiś przykład programu - o ile się da ^.^

Odnośnie 3) to nie dostałem odpowiedzi.

1)Debugger służy do wyszukiwania błędów w trakcie działania programu a nie w trakcie kompilacji/linkowania.

2)Bardzo początkującemu - wcale(bo zakładam, że nie umie używać :wink: ). Początkującemu i dalej - do wszystkiego.

3)To jest praca krokowa. Zaczyna się przez: Debug->Step Into lub F11. Można rozpocząć pracę krokową po breakpoincie.

OK, ale jak skompiluję program bez debuggera, w którym będzie odniesienie się do nieistniejącego el. tablicy, to i tak wyświetli się błąd - a debugger nie pracował :expressionless:

A odnośnie 2) i 3) to dzięki :slight_smile:

Wyświetli się błąd ale nie pokaże w której linijce, a z debugerem pokaże która linijka spowodowała error :stuck_out_tongue:

Z debuggerem, pokaże się tylko strzałka, która będzie wskazywała na klamrę kończącą funkcje main…

To co robisz to kompilacja, nie debugowanie. Debugowanie to “sprawdzanie” WYKONYWANIA programu, nie kompilacji. Doczytaj.

Eee, robię:

  1. kompilację + debugging :arrow: wyświetla się błąd o odniesieniu się do nieistniejącego el. tablicy

  2. samą kompilację :arrow: i tak wyświetli się ten błąd, pomimo, że debugger nie startował.

Wiem co to jest debugowanie :stuck_out_tongue:

Nie, nie wiesz. Po błędnej kompilacji debugger _nie startuje_, chyba, że z poprzednią _poprawnie_ skompilowaną wersją.

OK, ale ja kompilację mam dobrą :!:

Mam tylko odnoszenie się do nieistniejacego elementu tablicy. Pomimo , że włącze opcje Start without debugging i tak wyświetli się w okienku dialogowym info o tym zdarzeniu. A debugger nie startował :!: O to mi cały czas chodzi.

Ah… Racja, mój błąd, przeoczyłem “el.”.

Odwołanie do nieistniejącego elementu tablicy to Access Violation, więc nie dziw się, że system wywala Ci program. Bez włączonego debuggera(albo bez podłączenia go w trakcie błędu) nie wskaże Ci linii w której błąd wystąpił, Call Stacka i innych przydatnych informacji.

Aha, czyli bez debuggera też wyświetli się komunikat o błędzie, tyle, że z włączonym debuggerem dostaniemy więcej infa na ten temat :?: Do tego on głównie jest (+ do pracy krokowej itp.) :?:

Poczytaj w sieci co to debugger, bo zadajesz podstawowe pytania.

Debugger jest do debugowania(odpluskwiania, wykrywania błędów w _działaniu_) programów. Praca krokowa to jeden ze sposobów.

A np. do sprawdzenia takiego kodu

int[] tablica;

...

n = pobierzDlugoscTablicy();

tablica = new int[n];

...

i = generujIndeksNaPodstawieParametrow(a, b);

tablica[i] = 0;

Więc jeśli będziesz chciał sprawdzić długość tablicy, to ustawiasz breakpointa przy definicji tablicy. Jeśli zaś pojawia Ci się wyjątek o przekroczeniu zakresu tejże tablicy, to ustawiasz breakpointa przy tablica_. W “Watch list” dodajesz zmienną i oraz n, zatem od razu widzisz, że coś jest nie tak, że winna może być funkcja generujIndeks. Oczywiście możesz sprawdzić także parametry a i b :)_

Generalnie służy do podglądu zmiennych oraz kontrolowania tego co się dzieje w programie.