2009-08-30 7 views
32
  1. Jeżeli ustawić watchpoint dla zmiennej lokalnej do bieżącego zakresu, zostanie on automatycznie usunięty, gdy dzieje się poza zakresem. Czy jest jakiś sposób, aby ustawić go raz i utrzymać go przy życiu zawsze, gdy wchodzisz w ten sam zakres?Jak ustawić stałe i warunkowe punkty obserwacyjne na zmiennych lokalnych?

  2. Czy mimo ustawić watchpoint warunkowego, jak watch var1 if var1==0? W moim przypadku warunek nie działa. gdb zatrzymuje się, gdy wartość var1 „s ulegnie zmianie, zamiast aż var1 == 0 jest prawdą. Mój gdb to GNU gdb 6.8-debian.

Odpowiedz

3
  1. nie jestem pewien, jaki język nam używasz, więc dokładna odpowiedź będzie różna, ale można zmienić zmienną albo być statyczny, globalny, lub dynamicznie przydzielane (i nie zrobić za darmo kiedy funkcja zwraca?). W ten sposób jego surowy adres nie ulegnie zmianie, a gdb będzie mógł na nim zatrzymać.

  2. Zamiast oglądać wartość trakt jest równa określonej wartości; powinieneś ustawić warunkowy punkt przerwania w wierszu, w którym chcesz sprawdzić wartość var1. Powinno to skutecznie mieć taki sam efekt:

np.

(gdb) break main.c:123 if (var1 == 0) 
+0

Używam C++. Używam punktu obserwacyjnego nad punktem przerwania, ponieważ w kodzie może być wiele miejsc zmieniających wartość zmiennej. Więc nie jest realistyczne dodawanie punktu przerwania do każdego miejsca. Chciałbym sprawdzić, czy możliwe jest ustawienie warunkowego punktu obserwacji. – Tim

29

Zgadzam się z Davem, że warunkowy punkt przerwania jest drogą do przebycia.

Jednakże, aby wykonać to, o co prosiłeś, możesz użyć polecenia GDB commands, aby ustawić listę poleceń GDB do wykonania po każdym trafieniu punktu przerwania. Uważam to za niezwykle przydatne.

Sugeruję napisanie poleceń GDB do pliku, aby można je było łatwo edytować i łatwo je załadować za pomocą polecenia source. Możesz też określić pliki poleceń, które chcesz załadować do wiersza poleceń GDB, lub użyć .gdbinit, aby załadować je automatycznie.

Przykładem dobrego wykorzystania commands:
Załóżmy, że mam funkcję format, która jest wywoływana przez wiele innych funkcji. Chcę go przerwać, ale dopiero po wywołaniu funkcji do_step_3.

break do_step_3 
commands 
    break format 
    continue 
end 

Można użyć do tego problemu z czymś takim:

break func 
commands 
    watch var 
    continue 
end 
+0

Doskonałe punkty! Dzięki! – Tim

12

Można ustawić warunki na watchpoints w ten sam sposób, co robisz z pułapki. Jest to in the documentation, ale co prawda nie zwraca na siebie uwagi.

Tak więc watch my_var if my_var > 3 działa dobrze, podobnie jak polecenie condition.

Aby odtworzyć punkt obserwacyjny, jeśli obserwowana przez niego zmienna wykracza poza zakres, polecenie gdb należy wykonać automatycznie przy użyciu punktu przerwania na początku funkcji, jak opisał Zan.

8

Można ustawić watchpoint że nie wykracza poza zakres poprzez ustawienie go na adres pamięci.

(gdb) p &var1 
$1 = (int *) 0x41523c0 
(gdb) watch *(int *)0x41523c0 
Hardware watchpoint 1: *(int *)0x41523c0 

Działa to również w przypadku innych typów danych i wskaźników.

+6

Może to być przydatne, ale nie będzie tutaj działać. Zmienne lokalne nie zachowują tego samego adresu między wywołaniami funkcji - ale inne zmienne stosu prawdopodobnie wykorzystają tę lokalizację pamięci ... – Nick