2016-02-19 10 views
5

Wenn ich meine C++ 11 Anwendung debuggen, möchte ich sehen, die Objekte unique_ptr und shared_ptr zeigen auf. Aber mit libstdC++ hübschen Druckern wird nur eine Zeichenfolge mit Adresse und ähnlichem gedruckt, aber ich kann sie nicht erweitern, um ihren Inhalt anzuzeigen. Ich habe bereits versucht, die folgende Abhilfe, aber ich habe für mich nicht:Zeigen Sie intelligente Zeiger in Eclipse CDT mit gdb hübsche Drucker

https://sourceware.org/ml/gdb/2013-04/msg00042.html

mir jemand dabei helfen kann. Eigentlich denke ich, dass dies ein ziemlich grundlegendes Problem sein könnte, also frage ich mich, ob es keinen Weg dazu gibt. Aber im Internet suchen konnte ich keinen Hinweis finden ...

Antwort

2

Nach Ihrem Link habe ich genau das getan, was Michael beschrieben hat, und es funktioniert gut. Wahrscheinlich haben Sie einen Fehler bei der Anwendung der Änderungen gemacht. Die libstdcxx/v6/printers.py sollte nun in den Zeilen 103 bis 174:

class SharedPointerPrinter: 
    "Print a shared_ptr or weak_ptr" 

    class _iterator: 
     def __init__(self, sharedPointer): 
      self.sharedPointer = sharedPointer 
      self.managedValue = sharedPointer.val['_M_ptr'] 
      self.count = 0 

     def __iter__(self): 
      return self 

     def next(self): 
      if self.managedValue == 0: 
       raise StopIteration 
      self.count = self.count + 1 
      if (self.count == 1): 
       return ('Use count', self.sharedPointer.val['_M_refcount']['_M_pi']['_M_use_count']) 
      elif (self.count == 2): 
       return ('Weak count', self.sharedPointer.val['_M_refcount']['_M_pi']['_M_weak_count'] - 1) 
      elif (self.count == 3): 
       return ('Managed value', self.managedValue) 
      else: 
       raise StopIteration 

    def __init__ (self, typename, val): 
     self.typename = typename 
     self.val = val 

    def children (self): 
     return self._iterator(self) 

    def to_string (self): 
     state = 'empty' 
     refcounts = self.val['_M_refcount']['_M_pi'] 
     if refcounts != 0: 
      usecount = refcounts['_M_use_count'] 
      weakcount = refcounts['_M_weak_count'] 
      if usecount == 0: 
       state = 'expired, weakcount %d' % weakcount 
      else: 
       state = 'usecount %d, weakcount %d' % (usecount, weakcount - 1) 
     return '%s (%s) to %s' % (self.typename, state, self.val['_M_ptr']) 

class UniquePointerPrinter: 
    "Print a unique_ptr" 

    class _iterator: 
     def __init__(self, uniquePointer): 
      self.uniquePointer = uniquePointer 
      self.managedValue = uniquePointer.val['_M_t']['_M_head_impl'] 
      self.count = 0 

     def __iter__(self): 
      return self 

     def next(self): 
      if self.managedValue == 0 or self.count == 1: 
       raise StopIteration 
      self.count = self.count + 1 
      return ('Managed value', self.managedValue) 

    def __init__ (self, typename, val): 
     self.val = val 

    def children (self): 
     return self._iterator(self) 

    def to_string (self): 
     v = self.val['_M_t']['_M_head_impl'] 
     return ('std::unique_ptr<%s> containing %s' % (str(v.type.target()), 
                 str(v))) 

Mit freundlichen Grüßen

+0

Danke, es jetzt für mich arbeitet. Aber ich bekomme einige Debugger-Warnungen: Warnung: RTTI-Symbol nicht für die Klasse gefunden std :: _ Sp_counted_ptr_inplace >, std :: Zuordner >>, (__gnu_cxx :: _ Lock_policy) 2> 'Ich bin mir nicht sicher, ob das ein Problem sein könnte – Johannes91

+0

Vielleicht hast du RTTI für gcc mit Flag -fno-rtti deaktiviert? Ich bekomme keine Debugger Warnungen, mit MinGW-w64 64bit gcc Version 6.2.0. Meine g ++ -Optionen sind -O0 -g3 -Wall -c -fmessage-length = 0 -std = C++ 11 -D_FILE_OFFSET_BITS = 64 -D__WXMSW__ – xamid

+0

Wenn jedoch Ihr Debugger fehlerhaft ist, sollte dies nicht wirklich ein Problem sein, wie erklärt [hier] (http://stackoverflow.com/questions/12986261/warning-message-rtti-symbol-not-found-when-using-boostiostreams/12991374#12991374). – xamid