oglądaj tylko przerwy w trakcie pisania, rwatch pozwala na przerwanie podczas odczytu, a awatch pozwala na przerwanie podczas odczytu / zapisu.
Możesz ustawić odczytane punkty obserwacyjne w lokalizacjach pamięci:
gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface
ale jedno ograniczenie dotyczy poleceń zegarka i awatera; nie możesz używać zmiennych gdb w wyrażeniach:
gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.
Więc musisz je rozwinąć:
gdb$ print $ebx
$13 = 0x135700
gdb$ rwatch *0x135700+0xec1a04f
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
gdb$ c
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
Value = 0xec34daf
0x9527d6e7 in objc_msgSend ()
Edycja: A tak przy okazji. Potrzebujesz wsparcia sprzętowego lub programowego . Oprogramowanie jest oczywiście znacznie wolniejsze. Aby dowiedzieć się, czy Twój system operacyjny obsługuje sprzętowe punkty obserwacyjne, możesz zobaczyć ustawienie środowiska can-use-hw-watchpoints .
gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.
watch -location mTextFormatted
.print &variable
watch
polecenia. Tymczasem jest to pierwsze pytanie, które przychodzi mi do głowy po przeczytaniu powyższego. Ile bajtówrwatch *0xfeedface
faktycznie obejrzy?rwatch *(int *)0xfeedface
I będzie on oglądaćsizeof(int)
bajty: sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints. htmlTo, czego szukasz, nazywa się punktem obserwacyjnym .
Stosowanie
(gdb) watch foo
: obserwuj wartość zmiennejfoo
(gdb) watch *(int*)0x12345678
: obserwuj wartość wskazywaną przez adres , rzutowaną na dowolny typ(gdb) watch a*b + c/d
: obejrzyj dowolnie złożone wyrażenie , poprawne w języku ojczystym programuPunkty obserwacyjne są trzech rodzajów:
Możesz wybrać bardziej odpowiedni dla swoich potrzeb.
Aby uzyskać więcej informacji, sprawdź to .
źródło
Zakładając, że pierwsza odpowiedź odnosi się do składni podobnej do C,
(char *)(0x135700 +0xec1a04f)
wówczas odpowiedź do wykonaniarwatch *0x135700+0xec1a04f
jest niepoprawna. Prawidłowa składnia torwatch *(0x135700+0xec1a04f)
.Brak
()
s sprawił mi wiele bólu, próbując samemu korzystać z punktów obserwacyjnych.źródło
Właśnie wypróbowałem następujące:
Wydaje się to możliwe, ale wydaje się, że potrzebujesz wsparcia sprzętowego.
źródło
Użyj zegarka, aby zobaczyć, kiedy zmienna jest zapisywana do, rwatch, gdy zostanie odczytana, i czuj, gdy zostanie odczytana / zapisana z / do, jak wspomniano powyżej. Należy jednak pamiętać, że aby użyć tego polecenia, musisz przerwać program, a zmienna musi mieć zasięg, gdy program zostanie uszkodzony:
źródło