2010-09-17 14 views
7

Próbuję debugować program napisany w C++. Oto kod:Funkcja przekroczenia GDB (następna) nie działa.

void a() { } 
void b() { a(); } 
int main() { b(); return 0; } 

Skompilowałem go, używając: g++ -g3 -O0 -o cards.exe cards.cpp. Oto wynik mojego sesji gdb:

(gdb) b main 
Breakpoint 1 at 0x401421: file cards.cpp, line 10. 
(gdb) r 
Starting program: C:\workspace\Cards\src/cards.exe 
[New thread 1624.0xa28] 
Breakpoint 1, main() at cards.cpp:10 
10 int main() 
(gdb) n 
12  b(); 
(gdb) n 
b() at cards.cpp:5 5 
void b() 
(gdb) n 
7  a(); 
(gdb) quit 
The program is running. Exit anyway? (y or n) 

Moje pytanie brzmi, dlaczego wysłaniem kolejnego polecenia do gdb jeszcze krok do funkcji? Używam g ++ 4.2.1-sjlj i gdb 6.8.

+0

Czy próbowałeś czegoś bardziej złożonego? – stefanB

+0

Właściwie tak, próbuję wykonywanie zapętlonych wywołań do(). Nadal nie będzie działać. Próbowałem również wyłączenie wprowadzania z __attribute __ ((noinline)), ale bezskutecznie. Próbowałem tego na moim Hackintoshu i działało. –

Odpowiedz

0

'n' jest następnym stwierdzeniem i nie będzie wchodził w funkcję.

Aby wejść do funkcji, użyj 's'. To jest krok.

+0

nie. 'n' DZIAŁA krok do funkcji. to jest właśnie problem, którym zajmuje się OP. – Blauhirn

5

W step i next polecenia działają jedną linię źródłowego na raz, więc gdy wszystko jest w jednej linii jedna next zajmuje mi prawo do końca main().

3 int main() { b(); return 0; } 
(gdb) n 
0x00001faa in start() 

Z kodu sformatowanej mniej gęsto ja nadal nie widzę rezultaty widoczne. Wstawiam wywołania funkcji w oddzielnych liniach, aby uzyskać gdb, aby przejść nad nimi po jednym na raz. Oto co mam wtedy:

jkugelman$ cat cards.cpp 
void a() { 
} 

void b() { 
    a(); 
} 

int main() { 
    b(); 
    return 0; 
} 
jkugelman$ g++ -g3 -O0 -o cards cards.cpp 
jkugelman$ gdb ./cards 
GNU gdb 6.3.50-20050815 (Apple version gdb-960) (Sun May 18 18:38:33 UTC 2008) 
<snip> 
Reading symbols for shared libraries .... done 

(gdb) b main 
Breakpoint 1 at 0x1ff2: file cards.cpp, line 9. 
(gdb) r 
Starting program: /Users/jkugelman/Development/StackOverflow/cards 
Reading symbols for shared libraries +++. done 

Breakpoint 1, main() at cards.cpp:9 
9  b(); 
(gdb) n 
10  return 0; 
(gdb) n 
11 } 
(gdb) n 
0x00001faa in start() 

nie mam odpowiedzi, ale ja po prostu chciałem podzielić się że gdb zachowuje się zgodnie z oczekiwaniami na moim iMac. W obu przypadkach gdb potraktował wywołanie b() jako jedną instrukcję i nigdy nie wszedł do wywołania funkcji.

+0

Próbowałem użyć Twojego kodu, ale krok dalej nie działa. Może dlatego, że używamy różnych wersji gdb? –

+0

Co oznaczają 'pomoc następna' i' krok pomocy' na twoim komputerze? –

+0

(gdb) help next Program kroków, przechodzenie przez wywołania podprogramów. Podobnie jak polecenie "step", dopóki wywołania podprogramów nie występują; kiedy to nastąpi, połączenie jest traktowane jako jedna instrukcja. Argument N oznacza wykonanie N razy (lub do momentu zatrzymania programu z innego powodu). (gdb) help step Powtórz program, aż dotrze do innej linii źródłowej. Argument N oznacza wykonanie N razy (lub do momentu zatrzymania programu z innego powodu). –