[अपराधी को खोजने के लिए सभी थ्रेड्स की जांच करें]
यहां तक कि पूरी तरह से विस्तारित कॉल स्टैक तब भी आप से कोड की वास्तविक आक्रामक रेखा को छिपा सकते हैं जब आप एक से अधिक धागे का उपयोग करते हैं!
उदाहरण: एक धागा रूबी हैश को पुन: प्रसारित कर रहा है, अन्य धागा इसे संशोधित करने का प्रयास कर रहा है। बूम! अपवाद! और 'व्यस्त' हैश को संशोधित करने का प्रयास करते समय आपके द्वारा प्राप्त किए गए स्टैक ट्रेस के साथ समस्या यह है कि यह आपको उस स्थान पर नीचे फ़ंक्शन की श्रृंखला दिखाता है जहां आप हैश को संशोधित करने का प्रयास कर रहे हैं, लेकिन यह नहीं दिखाता है कि वर्तमान में कौन इसे समानांतर में पुनरावृत्त कर रहा है ( जो इसका मालिक है)! यहां यह पता लगाने का तरीका है कि वर्तमान में चल रहे थ्रेड्स के लिए स्टैक ट्रेसिंग प्रिंट करके। यहां बताया गया है कि आप यह कैसे करते हैं:
# This solution was found in comment by @thedarkone on https://github.com/rails/rails/issues/24627
rescue Object => boom
thread_count = 0
Thread.list.each do |t|
thread_count += 1
err_msg += "--- thread #{thread_count} of total #{Thread.list.size} #{t.object_id} backtrace begin \n"
# Lets see if we are able to pin down the culprit
# by collecting backtrace for all existing threads:
err_msg += t.backtrace.join("\n")
err_msg += "\n---thread #{thread_count} of total #{Thread.list.size} #{t.object_id} backtrace end \n"
end
# and just print it somewhere you like:
$stderr.puts(err_msg)
raise # always reraise
end
उपरोक्त कोड स्निपेट केवल शैक्षिक उद्देश्यों के लिए भी उपयोगी है क्योंकि यह आपको दिखा सकता है (जैसे एक्स-रे) आपके पास वास्तव में कितने धागे हैं (बनाम आपने कितने सोचा है - अक्सर उन दो अलग-अलग संख्याएं हैं;)