2011-12-20 12 views
5

मैं कस्टम सी ++ मैट्रिक्स क्लास दिखाने के लिए जीडीबी की सुंदर प्रिंटिंग सुविधाओं का उपयोग करने की कोशिश कर रहा हूं।जीडीबी सीधी फ़ंक्शन कॉल के साथ सुंदर प्रिंटिंग

कक्षा काफी मानक है जिसे आप कहीं भी पा सकते हैं। यह प्रकार द्वारा पैरामीटर द्वारा टेम्पलेट किया गया है, और सी-प्रकार नोटेशन जैसे मैट [i] [j] के साथ पहुंचा जा सकता है। यह पहली बार एक पंक्ति या कॉलम का प्रतिनिधित्व करने वाला एक और टेम्पलेट "स्लाइस" वर्ग देता है, जिसे डेटा निकालने के लिए [] ऑपरेटर द्वारा फिर से एक्सेस किया जा सकता है। कक्षा स्वयं भंडारण के लिए एक सादा सी सरणी का उपयोग कर रही है, लेकिन यह उस पर कुछ चालें लागू कर रही है, जैसे कि बड़े मैट्रिक्स को पूर्व-आवंटित करने का विकल्प, गैर-शून्य प्रारंभ करने में सक्षम, स्ट्रइड इत्यादि का उपयोग करना। कक्षा में मूल प्रिंटिंग नहीं है इंटरफ़ेस, और मैं इसे संशोधित नहीं कर सकता, या आसानी से अपने कोड से लिंक कर सकता हूं।

कस्टम फीचर्स पाइथन में प्रत्यक्ष डेटा एक्सेस कोड को पुन: पेश करने में दर्दनाक बनाती हैं। लेकिन क्या यह आवश्यक है? सामान्य रूप से: क्यों सुंदर प्रिंटिंग डेटा तक पहुंचने के तर्क को पुन: उत्पन्न करना चाहिए? क्या मैं सिर्फ सी ++ कॉल का उपयोग नहीं कर सकता और [] ऑपरेटरों को i, j-th तत्व मुद्रित करने के लिए उपयोग नहीं कर सकता? तथ्य यह है कि इस अनुरोध के दौरान स्लाइस क्लास जीडीबी में एक अस्थायी है, इससे आगे यह जटिल हो जाता है।

मैं पाइथन और जीडीबी स्क्रिप्टिंग के साथ भी शुरुआत कर रहा हूं। मैंने gdb.execute कॉल के साथ डेटा एक्सेस को प्रतिस्थापित करने के लिए उदाहरणों को हैक करने का प्रयास किया है, लेकिन मुझे नहीं पता कि ऑब्जेक्ट नाम को to_string फ़ंक्शन से कैसे एक्सेस किया जाए, इसलिए मैं gdb.execute (??? + '[] जैसे कुछ उपयोग कर सकता हूं + str (i) + ']', झूठी, सच)।

मुझे आश्चर्य है कि ऐसा करने का सबसे प्रभावी तरीका क्या है।

उत्तर

5

क्या मैं सिर्फ सी ++ कॉल का उपयोग नहीं कर सकता और [] ऑपरेटरों को i, j-th तत्व मुद्रित करने के लिए उपयोग नहीं कर सकता?

आप बहुत-प्रिंटर से अवर (डिबग जा रहा है) प्रक्रिया का उपयोग कर gdb.parse_and_eval (docs) में कॉल कर सकते हैं, लेकिन यह कई नुकसान हैं:

  • आप एक "लाइव" प्रक्रिया की जरूरत है यह करने के लिए (दूसरे शब्दों में, जब आप कोर डंप डीबग कर रहे हों तो आपका सुंदर प्रिंटर काम नहीं करेगा)
  • यदि अवरक्त किसी तरह से भ्रष्ट है, तो इसमें कॉलिंग फ़ंक्शंस इसे और भी
  • दूषित कर देगा यदि निम्नतम बहु- थ्रेडेड, और सुंदर प्रिंस ter एक फ़ंक्शन में कॉल करता है जिसके लिए लॉक की आवश्यकता हो सकती है (उदा। malloc), तो आपको सुंदर प्रिंटर को डेडलॉक करने की संभावना है, और ऐसे डेडलॉक से पुनर्प्राप्त करने का कोई तरीका नहीं होगा।
+2

किसी एक साथ एक उदाहरण फेंक कर सकते हैं, कृपया सकता है? – takbal

1

यह पाइथन स्क्रिप्टिंग नहीं है, लेकिन जीडीबी एक्सटेंशन के लिए सरल command sequences है। मैं print_matrix नामक एक नए कमांड को परिभाषित कर रहा हूं।

(gdb) define print_matrix 
Type commands for definition of "print_matrix". 
End with a line saying just "end". 
>set $s_arr = $arg0 
>set $i=0 
>while($i < $arg1) 
>p (int [][$arg2]) *($s_arr + $i) 
>set $i = $i + 1 
>end 
>end 
(gdb) print_matrix arr 10 10 
$90 = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}} 
$91 = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} 
$92 = {{2, 3, 4, 5, 6, 7, 8, 9, 10, 11}} 
$93 = {{3, 4, 5, 6, 7, 8, 9, 10, 11, 12}} 
$94 = {{4, 5, 6, 7, 8, 9, 10, 11, 12, 13}} 
$95 = {{5, 6, 7, 8, 9, 10, 11, 12, 13, 14}} 
$96 = {{6, 7, 8, 9, 10, 11, 12, 13, 14, 15}} 
$97 = {{7, 8, 9, 10, 11, 12, 13, 14, 15, 16}} 
$98 = {{8, 9, 10, 11, 12, 13, 14, 15, 16, 17}} 
$99 = {{9, 10, 11, 12, 13, 14, 15, 16, 17, 18}} 
(gdb) 

तुम भी एक स्क्रिप्ट के रूप में इन आदेशों बचाने के लिए और का उपयोग -x विकल्प

gdb -x <commands file name> binary.out 
+0

धन्यवाद, लेकिन मुझे सुंदर प्रिंटिंग सुविधा का उपयोग करने की आवश्यकता है क्योंकि ग्रहण के साथ इसका एकीकरण है। – takbal

संबंधित मुद्दे