Chromium Chronicle Nr. 13: Debugging von Zeitreisen mit RR

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.