The Chromium Chronicle #13: RR এর সাথে টাইম-ট্রাভেল ডিবাগিং

পর্ব 13: ম্যাডিসন, WI-এ ক্রিশ্চিয়ান বিসিঞ্জার দ্বারা (মার্চ, 2020)
আগের পর্বগুলো

আপনি কি নিজেকে ডিবাগারে বারবার একই পরীক্ষা চালাচ্ছেন , কোডটি কীভাবে খারাপ অবস্থায় এসেছে তা বোঝার চেষ্টা করছেন? আমরা আপনার জন্য একটি টুল আছে! ইন্সটল এবং সেটআপ করা সহজ, এটি একটি এক্সিকিউশন ট্রেস রেকর্ড করবে এবং এটি gdb কে জাদুকর নতুন ক্ষমতা দেয়। পিছনের দিকে যান, পিছনের দিকে চালান , দেখুন ভেরিয়েবলগুলি কোথায় তাদের মান পরিবর্তন করেছে বা কখন একটি ফাংশন একটি বস্তুতে শেষবার কল করা হয়েছিল (শর্তসাপেক্ষ ব্রেকপয়েন্ট ব্যবহার করে)।

লিনাক্সে, আপনি 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 ( rn ), reverse-cont ( rc ), reverse-step ( rs ), reverse-fin ব্যবহার করতে পারেন।

এগুলি এখনও আপনার সেট করা যেকোনো ব্রেকপয়েন্টকে সম্মান করে। উদাহরণ স্বরূপ:

(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 উপযোগী হতে পারে এমন অনেক উপায় আছে। আপনি ব্যবহার করতে পারেন এমন অন্যান্য কমান্ড রয়েছে, যেমন কখন আপনি কোন ইভেন্ট নম্বরে আছেন তা খুঁজে বের করতে বা প্রতিটি লাইনের জন্য একটি প্রসেস আইডি এবং ইভেন্ট নম্বর সহ stdout টীকা করতে rr replay -M । আরও বিস্তারিত জানার জন্য RR ওয়েবসাইট এবং ডকুমেন্টেশন দেখুন।