Debugger w MS Visual 2008 C++ Express


(Jooooooozek) #1

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:


(Kalin 93) #2

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 ?


(Fiołek) #3

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.


(Kalin 93) #4

O dzięki :wink:


(Jooooooozek) #5

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


(Kalin 93) #6

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.


(Jooooooozek) #7

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.


(Fiołek) #8

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.


(Jooooooozek) #9

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:


(Kalin 93) #10

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:


(Jooooooozek) #11

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


(Fiołek) #12

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


(Jooooooozek) #13

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:


(Fiołek) #14

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


(Jooooooozek) #15

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.


(Fiołek) #16

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.


(Jooooooozek) #17

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.) :?:


(Fiołek) #18

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.


(Kubarek) #19

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.