एपिसोड 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
वगैरह. हालांकि, आपके पास
रिवर्स-नेक्स्ट (rn
), रिवर्स-कॉन्ट (rc
), रिवर्स-स्टेप (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
को हर लाइन में प्रोसेस आईडी और इवेंट नंबर के साथ एनोटेट करें. यहां जाएं:
ज़्यादा जानकारी के लिए, आरआर की वेबसाइट और दस्तावेज़ देखें.