Chromium Chronicle #13: RR ile Zaman Yolculuğunda Hata Ayıklama

Bölüm 13: Christian Biesinger, Madison, WI (Mart 2020)
Önceki bölümler

Hata ayıklayıcıda aynı testi tekrar tekrar çalıştırdığınızı fark ettiniz mi? anlamaya mı çalışıyorsunuz? Size uygun bir aracımız var. Yüklemesi ve kurulumu kolaydır. Yürütme izlemesi kaydeder ve gdb için yeni sihirli güçler. Geriye doğru ilerleyin, geriye doğru koşun, değişkenlerinin değerlerini veya işlevin bir nesne üzerinde en son ne zaman çağrıldığını değiştirdiği (koşullu ayrılma noktaları kullanılarak).

Linux'ta rr'yi kullanabilirsiniz. sudo apt-get install rr veya https://rr-project.org/ adresinden edinebilirsiniz.

Bu özellik resmi olarak desteklenmemektedir, ancak çok yararlıdır. rr şöyle çalışır: önce bir izin kaydeder, sonra da tekrar oynatırsınız.

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

Rahatça, her tekrar oynatışınızda zamanlama ve işaretçi adresleri aynı kalır görebilirsiniz. rr pack ile izler taşınabilir hale getirilebilir. Böylece videoları başka bir makineye kopyalayıp orada yeniden oynatabilir veya daha sonra bile yeniden oynatabilir yeniden derleme. continue kullanarak programınızı çalıştırın. Tüm normal GDB komutları -b, next, watch vb. Ancak şunu da kullanabilirsiniz: ters-sonraki (rn), ters-devam (rc), ters adım (rs), ters-fin.

Bunlar, ayarladığınız tüm ayrılma noktalarına uyar. Örneğin:

(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*> (

Bu örnekte basit olması için --single-process kullandım, ancak bu gerekmez. RR birden çok süreci izleyebilir; sonrasında rr ps uygulamasını kullanarak bir liste görün ve rr replay -f PID ile tekrar oynatmak için birini seçin.

RR'nin yararlı olabileceği birçok durum vardır. Kullanabileceğiniz başka komutlar vardır. Örneğin, hangi etkinlikte olduğunuzu ne zaman öğreneceğiniz veya rr replay -M stdout öğesine her satır için işlem kimliği ve etkinlik numarası ekleyin. Görüntüleyin Daha fazla bilgi için RR web sitesini ve belgelerini inceleyin.