2012-11-16 15 views
9

Czy istnieje sposób ustawienia punktu przerwania w każdym wierszu kodu za pomocą GDB? Oczywiście nie chcę uderzać b *addr dla każdej linii, więc zastanawiam się, czy istnieje szybki sposób na zrobienie tego.Ustaw punkt przerwania dla każdej linii w GDB

Edytuj Zwróć uwagę, że używam pliku binarnego utworzonego przez kogoś innego i nie mam dostępu do kodu źródłowego. Niestety ten plik binarny nie został skompilowany z flagą -g. Dlatego nie mogę po prostu przejść przez każdy wiersz kodu.

Dalsze Edit Jason zaznacza poniżej, można rzeczywiście pojedynczy krok poprzez kod tak długo, jak używać si lub ni, w przeciwieństwie do po prostu s (krok) lub n (obok). n lub s działa dobrze, jeśli kod źródłowy został skompilowany z -g, ale przechodzi przez linie kodu źródłowego, a nie przechodzi przez każdą instrukcję montażu, taką jak ni lub si w pliku binarnym skompilowanym bez -g .

+0

Co chcesz zrobić na każdym kroku? Dla 'list': http://stackoverflow.com/questions/4362581/get-gdb-to-do-a-list-after-every-step –

Odpowiedz

7

Użyj si (stepi) do instrukcji krok po kodzie. Możesz użyć ni (nexti), aby przejść do funkcji biblioteki, które Cię nie interesują. Jeśli przypadkowo wpadniesz na jeden z nich, finish powinno przywrócić cię do pierwotnej rutyny. Osoby pracujące na tym poziomie mają zwykle zestaw gdb wyświetlający kilka następnych instrukcji, które mają zostać wykonane, np. disp/3i $pc.

+0

Wow, takie proste rozwiązanie. Używałem n i s, zamiast ni lub si. Działa świetnie. Ciekawi mnie, jak GDB interpretuje ni vs n. Również disp/3i $ pc jest niezwykle pomocny. – smaccoun

+1

'next' używa informacji o linii źródłowej z informacji debugowania, aby określić zakres adresów linii źródłowej. Linia 10 może przejść od 0x100 do 0x116, więc debugger (za kulisami), instrukcja, postępuje zgodnie z każdą instrukcją, aż komputer będzie 0x116. Komplikacje obejmują przejście do innej funkcji lub opuszczenie bieżącej funkcji (polecenie return, longjmp, wyjątek zgłoszony), w którym to przypadku chcesz zatrzymać wykonywanie. Kiedy debugger podejmie próbę wywołania podprogramu, ustawia punkt przerwania na pierwotnej funkcji i kontynuuje. Za kulisami dzieje się wiele rzeczy. "ni" to niższy poziom. –

1

Nie możesz po prostu umieścić punktu przerwania w pierwszym wierszu wykonywania, a następnie przejść przez każdą linię? To zależy od tego, co próbujesz osiągnąć, ustawiając punkty przerwania w każdym wierszu. Jeśli chcesz oceniać wyrażenia, możesz to zrobić postępując zgodnie z moją logiką (krok po linii).

+0

Dobra uwaga. Masz rację, ale zapomniałem powiedzieć, że używam pliku binarnego, który nie został skompilowany z flagą -g. Nie mam również dostępu do kodu źródłowego, więc nie mogę przekompilować z -g. Niestety nie pozwala mi to na pojedynczy krok. Pytanie zostało zredagowane dla jasności – smaccoun

Powiązane problemy