Folge 13: von Christian Biesinger in Madison, Wisconsin (März 2020)
Vorherige Folgen
Führen Sie im Debugger häufig denselben Test durch?
wie der Code
in einem schlechten Zustand ist? Wir haben ein Tool für Sie.
Das Tool lässt sich einfach installieren und einrichten, zeichnet ein Ausführungs-Trace auf
magische neue Kräfte für gdb
. Schritte rücken
Variablen haben ihren Wert geändert oder wann eine Funktion zuletzt für ein Objekt aufgerufen wurde
(mit bedingten Haltepunkten).
Unter Linux können Sie rr verwenden. Mit sudo apt-get install rr
installieren oder
unter https://rr-project.org/.
Diese Funktion wird offiziell nicht unterstützt, ist aber sehr nützlich. rr
funktioniert so:
zeichnen Sie zuerst einen Trace auf und spielen ihn noch einmal ab.
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
Das Timing und die Zeigeradressen bleiben bei jeder Wiedergabe gleich.
denselben Trace. Traces können mit rr pack
übertragbar gemacht werden, sodass Sie
können sie auf einen anderen Computer kopieren und dort wiedergeben
der Neukompilierung. Führen Sie Ihr Programm mit continue
aus. Sie können alle regulären
GDB-Befehle -b
, next
, watch
usw. Sie können jedoch auch
reverse-next (rn
), reverse-cont (rc
), reverse-step (rs
),
reverse-fin.
Auch hier werden alle von Ihnen festgelegten Haltepunkte berücksichtigt. Beispiel:
(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*> (
In diesem Beispiel habe ich der Einfachheit halber --single-process
verwendet.
nicht notwendig. RR kann mehrere Prozesse verfolgen; können Sie nach der Aufnahme
Rufe mit rr ps
eine Liste auf und wähle eine Liste für die erneute Wiedergabe mit rr replay -f PID
aus.
Es gibt viele Möglichkeiten, wie RR nützlich sein kann. Es gibt weitere Befehle, die Sie verwenden können,
z. B. wann Sie herausfinden, an welcher Nummer Sie sich befinden, oder rr replay -M
, um stdout
mit einer Prozess-ID und einer Ereignisnummer für jede Zeile zu versehen. Weitere Informationen finden Sie unter
Weitere Informationen finden Sie auf der RR-Website und in der Dokumentation.