The Chromium Chronicle #13: تصحيح أخطاء السفر عبر الزمن باستخدام RR

الحلقة 13: أداء "كريستيان بيزنغر" في مدينة ماديسون، ويسكونسن (آذار/مارس 2020)
الحلقات السابقة

هل تجد نفسك تجري الاختبار نفسه مرارًا وتكرارًا في برنامج تصحيح الأخطاء؟ محاولة معرفة كيف أصبحت التعليمات البرمجية في حالة سيئة؟ لدينا أداة من أجلك وهي سهلة التثبيت والإعداد، وستسجّل أثر تنفيذي القوى السحرية الجديدة لـ gdb. الرجوع إلى الخلف، والترجيع، ومعرفة أو تغيرت قيمتها أو متى تم استدعاء دالة آخر مرة على كائن (باستخدام نقاط توقف مشروطة).

على نظام التشغيل Linux، يمكنك استخدام rr. التثبيت باستخدام sudo apt-get install rr أو من https://rr-project.org/

هذا غير معتمد رسميًا، ولكنه مفيد للغاية. إنّ طريقة عمل rr يمكنك تسجيل عملية تتبُّع أولاً، ثم إعادة تشغيلها.

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

بشكل ملائم، تظل عناوين الوقت والمؤشر كما هي في كل مرة تعيد فيها تشغيل نفس الأثر. يمكن جعل الآثار قابلة للنقل باستخدام rr pack بحيث ويمكنهم نسخها إلى جهاز آخر وإعادة تشغيلها هناك أو إعادة تشغيلها حتى بعد لإعادة التجميع. يمكنك تشغيل برنامجك باستخدام continue. يمكنك استخدام جميع جداول البيانات أوامر GDB -b وnext وwatch وما إلى ذلك. ومع ذلك، يمكنك أيضًا استخدام reverse-next (rnreverse-cont (rcreverse-step (rsالزاوية العكسية

ولا تزال هذه النقاط تحترم أي نقاط توقف حدّدتها. على سبيل المثال:

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

في هذا المثال، استخدمت --single-process للتبسيط، ولكن هذا ليس ضروريًا. بإمكان RR تتبُّع عمليات متعددة: بعد التسجيل، يمكنك يمكنك الاطّلاع على قائمة باستخدام "rr ps" واختيار قائمة لإعادة تشغيلها باستخدام "rr replay -f PID".

هناك الكثير من الطرق التي يمكن أن تكون بها RR مفيدة. هناك أوامر أخرى يمكنك استخدامها، مثل وقت معرفة رقم الفعالية الذي أنت فيه، أو rr replay -M لإضافة تعليق توضيحي إلى stdout برقم تعريف العملية ورقم الحدث لكل سطر. عرض الموقع الإلكتروني لـ RR والمستندات لمزيد من التفاصيل.