2013-06-03 28 views
9

Mam debugowanie statycznej wielowątkowej aplikacji C++ w wersji 86-64 na Linux.Krok gdb nie działa zgodnie z oczekiwaniami

Potrafię ustawiać punkty przerwania funkcji i zatrzymywać się na nich. Mogę poruszać się krok po kroku nad ciałem funkcji. Ale kiedy próbuję przejść do innej funkcji, gdb nie zatrzymuje się na początku i wydaje się, że po prostu kontynuuje wykonywanie. Kiedy przerwać wykonywanie programu, gdb idzie uszkodzony stan i staje się bezużyteczny:

(gdb) bt 
Target is executing. 
(gdb) c 
Continuing. 
Cannot execute this command while the selected thread is running. 
(gdb) 

Jako obejście mogę wykorzystać stepi kilkakrotnie zamiast step, stepi działa zgodnie z oczekiwaniami. Co może być przyczyną tego zachowania? Czy są jakieś obejścia oprócz używania stepi? Używam gdb 7.6 i gcc 4.7.1.

+0

Czy skompilowałeś cel za pomocą '-ggdb' i' -O0'? Czy próbowałeś obserwować różnicę między krokiem ('s') i następnym (' n')? – Reinderien

+0

@Reinderien, mój cel jest skompilowany z '-g' i' -O0'. Jak mogę zaobserwować różnicę między 's' i' n'? – ks1322

+0

Spróbuj zmienić z '-g' na' -ggdb'. Aby zobaczyć różnicę, krok po kroku wpisując 's' (skutecznie" wkroczyć ") w miejsce' n' (skutecznie "krok po kroku") w gdb. – Reinderien

Odpowiedz

12

Co może być przyczyną tego zachowania?

To błąd w GDB. Ustawia tymczasowy punkt przerwania i oczekuje, że zostanie trafiony. Ale punkt przełomowy nie zostaje trafiony (być może dlatego, że został ustawiony w niewłaściwym miejscu), a wewnętrzny komputer stanu GDB jest zdezorientowany.

Czy są jakieś obejścia oprócz korzystania ze Stepi?

Można próbować uaktualnienie do wersji GDB top-of-bagażniku z CVS, a jeśli GDB jest nadal uszkodzony, zgłoś błąd w GDB bugzilla.

+0

Czy ktoś to zgłosił? Jaki jest numer błędu? –

+0

@LightnessRacesinOrbit, Dowiedziałem się o tym niedawno, zobacz minimalny reproduktor w raporcie o błędzie https://sourceware.org/bugzilla/show_bug.cgi?id=17134 – ks1322

1

Krok polecenie Warning:

Jeśli użyć polecenia krok podczas kontroli jest wewnątrz funkcji, który został skompilowany bez informacji diagnostycznych, wykonywanie przechodzi aż kontrola osiąga funkcję, która ma informacje debugowania. Podobnie nie wejdzie w funkcję, która jest kompilowana bez debugowania informacji.

Ponadto, polecenie kroku wprowadza tylko funkcję, jeśli istnieje informacja o numerze linii dla tej funkcji. W przeciwnym razie działa jak następne polecenie.

2

To trochę stary post. Wciąż wierzę, że ktoś może z tego skorzystać.

Uderzyłem w ten sam problem. W moim przypadku proces był wielowątkowy. I zdarzyło mi się zauważyć, że wątek, który uderzył w punkt krytyczny został zatrzymany, a inne wątki zostały wykonanie:

6 Thread 1000368545 (running) 
    5 Thread 1000368389 (running) 
    4 Thread 1000368388 (running) 
    3 Thread 1000368387 (running) 
    2 Thread 1000368386 myBreakPointFunction() at location/in/my/sourcefile.c:linenumber 
* 1 Thread 1000367766 (running) 

Wydając „bt” dowodzić to nie napis "docelowy jest wykonywany. Po przejściu do wątku 2 (wydając "wątek 2") i wydaniu bt, mogłem zobaczyć moje śledzenie połączeń. Aby uzyskać więcej informacji lub chciałbyś przeprowadzić pewne eksperymenty, sugeruję, aby pomocne było "ustawienie blokowania harmonogramu". Szczegóły tego trybu są dostępne pod adresem: https://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html

+0

Dlaczego miałbyś wyświetlać listę wątków, ale nie wyświetlać polecenia? – clearlight

Powiązane problemy