2013-03-01 6 views
12

जब मैं जावा में कोड लिखता हूं, तो मैं ग्रहण में एम्बेडेड डीबगर का उपयोग करता हूं। इस संदर्भ में किसी ऑब्जेक्ट को विज़ुअलाइज़ करते समय, डीबगर स्वचालित रूप से toString() फ़ंक्शन को कॉल करता है, सुविधा जो मुझे प्रोग्राम स्थिति की खोज करते समय त्वरित विज़ुअलाइज़ेशन के लिए बहुत सुविधाजनक लगता है।सी संरचनाओं के लिए जीडीबी प्रिंट फ़ंक्शन को परिभाषित करना

अब, जब मैं सी में काम करता हूं, तो मैं डीबगिंग के लिए emacs + gdb का उपयोग करता हूं, लेकिन जटिल सी संरचनाओं (यानी एक विशिष्ट प्रिंटिंग फ़ंक्शन को कॉल करने के लिए) को समकक्ष सुविधा खोजने/पुन: बनाने का प्रबंधन नहीं किया गया। बेशक कोई सामान्य toString() विधि नहीं है, लेकिन वैसे भी मैंने अक्सर अपनी संरचनाओं के लिए एक प्रिंटिंग फ़ंक्शन लागू किया है।

लेकिन जब मैं जीडीबी में कुछ विज़ुअलाइज़ करना चाहता हूं, तो मुझे इन मुद्रण कार्यों को मैन्युअल रूप से gdb से p my_print_function(my_struct_pointer) पर कॉल करना होगा, जो काफी अक्षम है (इसका नाम याद रखना होगा, इसे सही टाइप करें, इसके अलावा मानक आउटपुट दूसरे में हो सकता है विंडोज...)।

बात मैं चाहूँगा gdb कहने के लिए कॉन्फ़िगर करने के लिए "जब struct सूचक प्रकार टी पर gdb प्रिंट समारोह बुला, स्वचालित रूप से उस उपयोगकर्ता परिभाषित मुद्रण समारोह ... कॉल" है। क्या इसे करने का कोई तरीका है ? अग्रिम में धन्यवाद।

उत्तर

5

अच्छा सवाल।

हां, मुझे लगता है। ऐसा लगता है कि जीडीबी 7 के पास "pretty-printers" written in Python के लिए समर्थन है। वास्तविक लक्ष्य भाषा में पहले से लिखित कोड का उपयोग करने के रूप में सुविधाजनक (मेरी राय में) नहीं, लेकिन शायद काफी अच्छा है।

These are the commands सुंदर प्रिंटर के साथ काम करने के लिए।

+0

वास्तव में इतना सुविधाजनक नहीं है ... लेकिन शायद सबसे अच्छा मौजूदा समाधान। धन्यवाद। – Hobbes

7

उपयोग print struct_var एक दिया struct

उपयोग print *struct_ptr के सदस्यों मुद्रित करने के लिए एक दिया struct सूचक के सदस्यों

उपयोग set print pretty on मुद्रित करने के लिए यदि आप प्रत्येक पंक्ति में एक सदस्य के साथ कोई दांतेदार प्रारूप में संरचनाओं मुद्रित करने के लिए GDB चाहते हैं, इस तरह:

$1 = { 
     next = 0x0, 
     flags = { 
      sweet = 1, 
      sour = 1 
     }, 
     meat = 0x54 "Pork" 
     } 

और भी आप ptype struct_var उपयोग कर सकते हैं बाहर मुद्रित करने के लिए एक दिया struct की परिभाषा

अधिक जानकारी here

1

हालांकि मैं सब gdb/अजगर सुंदर मुद्रण सिद्धांत जानने के लिए समय नहीं था, मैं gdb में मेरी सी प्रिंटर पुन: उपयोग करने के लिए एक सरल रास्ता मिल गया। structs "struct_name_1" और सी समारोह "struct_printer_1_c_func" से "struct_name_2" और "struct_printer_2_c_func" लिंक करने के लिए

उदाहरण:

1) एक फ़ाइल struct_printers.py

class Pstruct (gdb.Function): 
    """Returns a string describing a struct... 
    """ 

    def __init__ (self): 
    super (Pstruct, self).__init__ ("pstruct") 

    def invoke (self, name): 
     expr_type = name.dereference().type.tag 
     expr_string = name.__str__()    
     expr_address = expr_string.split(" ")[0]  
     if (cmp(expr_type, "struct_name_1") == 0): 
     return gdb.parse_and_eval("struct_printer_1_c_func("+ expr_address +")") 
     elif (cmp(expr_type, "struct_name_2") == 0): 
     return gdb.parse_and_eval("struct_printer_2_c_func("+ expr_address +")") 
     else: 
     print "[No struct printer for this type]" 
     return gdb.parse_and_eval(expr_address) 

Pstruct() 

2 बनाएं) जोड़ें यह आपके .gdbinit रहे हैं:

source struct_printers.py 

define pstruct 
p $pstruct($arg0) 
end 

फिर जब अपने एक struct आप परीक्षण करना चाहते करने के लिए एक सूचक के सामने gdb में हैं, प्रिंट के बजाय pstruct कहते हैं।

शायद बदसूरत और खराब एक्स्टेंसिबल, लेकिन मुझे जो चाहिए उसके लिए काफी अच्छा काम करता है (हालांकि मुझे प्रसन्नता होगी कि मैं किसी को पाइथन सुंदर प्रिंटिंग सामग्री के साथ ऐसा करने का सही तरीका जानता हूं)।

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