Chromium Chronicle nr 13: debugowanie w czasie i podróży przy użyciu RR

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.