2016-02-19 23 views
5

Quando eseguo il debug dell'applicazione C++ 11, voglio vedere gli oggetti unique_ptr e shared_ptr puntati. Ma usando le stampanti graziose libstdC++, viene stampata solo una stringa con indirizzo e materiale simile, ma non posso espanderla per vederne il contenuto. Ho già provato la seguente soluzione, ma non ho lavorato per me:Visualizzare i puntatori intelligenti in eclipse cdt utilizzando le stampanti gdb pretty

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

Qualcuno può aiutare in questo. In realtà penso che questo potrebbe essere un problema piuttosto elementare, quindi mi chiedo se non ci sia modo di farlo. Ma cercando su internet non ho trovato nessun suggerimento ...

risposta

2

Seguendo il tuo link, ho fatto esattamente quello che Michael ha descritto, e funziona perfettamente. Probabilmente, hai fatto qualche errore nell'applicare le modifiche. Il libstdcxx/v6/printers.py dovrebbe ora avere in linee 103-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))) 

Cordiali saluti

+0

Grazie, funziona per me ora. Ma ricevo alcuni avvisi di debugger: avviso: simbolo RTTI non trovato per la classe 'std :: _ Sp_counted_ptr_inplace >, std :: allocator >> (__gnu_cxx :: _ Lock_policy) 2> 'Non sono sicuro se questo potrebbe essere un problema – Johannes91

+0

Forse hai disabilitato RTTI per gcc usando flag -fno-rtti? Non ricevo alcun avviso di debugger, utilizzando MinGW-w64 64 bit gcc versione 6.2.0. Le mie opzioni g ++ sono -O0 -g3 -Wall -c -fmessage-length = 0 -std = C++ 11 -D_FILE_OFFSET_BITS = 64 -D__WXMSW__ – xamid

+0

Tuttavia, se il tuo debugger è bacato, questo non dovrebbe essere un problema come spiegato [qui] (http://stackoverflow.com/questions/12986261/warning-message-rtti-symbol-not-found-when-using-boostiostreams/12991374#12991374). – xamid