Odcinek 13: Christian Biesinger, Madison, Wisconsin, marzec 2020 r.
Poprzednie odcinki
Czy zdarza się, że wciąż wykonujesz ten sam test w debugerze,
ale nie wiesz, dlaczego
kod jest w złym stanie. Mamy narzędzie dla Ciebie
Można ją łatwo zainstalować i skonfigurować. Rejestruje ona ślad wykonania,
gdb
ma nowe magiczne moce. Kroki do tyłu lub do tyłu, patrz gdzie
zmienne zmieniły swoją wartość lub ostatnio wywołano funkcję na obiekcie.
(przy użyciu warunkowych punktów przerwania).
W Linuksie możesz użyć rr. Zainstaluj za pomocą sudo apt-get install rr
lub
ze strony https://rr-project.org/.
Nie jest to oficjalnie obsługiwane, ale bardzo przydatne. Sposób działania rr
jest taki,
najpierw rejestrujesz log czasu, a potem ponownie go odtwarzasz.
rr record .../content_shell --no-sandbox --disable-hang-monitor --single-process
# record the trace. --single-process is optional, see below. The other flags are required.
rr replay # This will replay the last trace
(gdb) # rr uses GDB to let you replay traces
W wygodny sposób adresy czasu i wskaźników pozostają takie same przy każdej ponownej rozgrywce.
taki sam ślad. Logi czasu można przekształcić za pomocą usługi rr pack
.
skopiować je na inny komputer
i odtworzyć na nim
i kolejną kompilację. Uruchom program za pomocą: continue
. Możesz użyć wszystkich zwykłych
Polecenia GDB: -b
, next
, watch
itp. Możesz też jednak używać
odwrotne_Dalej (rn
), odwrotne_ciągi (rc
), odwrotne_kroki (rs
),
odwrotny kąt.
Uwzględniane są wszystkie ustawione przez Ciebie punkty przerwania. Na przykład:
(gdb) c # Execute to the end
(gdb) break blink::LayoutFlexibleBox::UpdateLayout
(gdb) rc # Run back to the last layout call
Thread 5 hit Breakpoint 1, blink::LayoutBlock::UpdateLayout (
this=0x121672224010)
(gdb) # Inspect anything you want here. To find the previous Layout call on this object:
(gdb) cond 1 this == 0x121672224010
(gdb) rc
Thread 5 hit Breakpoint 1, blink::LayoutBlock::UpdateLayout (
this=0x121672224010)
(gdb) watch -l style_.ptr_ # Or find the last time the style_ was changed
(gdb) rc
Thread 5 hit Hardware watchpoint 2: -location style_.ptr_
Old value = (const blink::ComputedStyle *) 0x1631ad3dbb0
New value = (const blink::ComputedStyle *) 0x0
0x00007f68cabcf78e in std::__Cr::swap<blink::ComputedStyle const*> (
Dla uproszczenia użyliśmy --single-process
, ale
nie jest konieczne. RR może śledzić wiele procesów; po zakończeniu nagrywania
zobaczyć listę za pomocą funkcji rr ps
i wybrać jedną z nich do ponownego odtworzenia w usłudze rr replay -f PID
.
RRSO może być przydatna na wiele sposobów. Są też inne polecenia, których możesz użyć,
np. kiedy sprawdzić numer wydarzenia, na którym jesteś, lub rr replay -M
.
, aby w każdym wierszu dodać do stdout
identyfikator procesu i numer zdarzenia. Zobacz
znajdziesz na stronie RR i w dokumentacji.