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.