2016-02-19 15 views
5

C++ 11 uygulamamda hata ayıkladığımda, unique_ptr ve shared_ptr öğelerinin işaret ettiği nesneleri görmek istiyorum. Ama libstdC++ güzel yazıcılar kullanarak, sadece adres ve benzer şeyler içeren bir dize yazdırılır, ancak içeriğini görüntülemek için genişletemiyorum. Zaten aşağıdaki geçici çözümü denedim ama benim için işe yaramadı:gdb güzel yazıcılarını kullanarak eclipse cdt'de akıllı işaretçileri görüntüleme

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

herkes bu konuda bana yardımcı olabilir. Aslında bunun oldukça basit bir sorun olabileceğini düşünüyorum, bu yüzden bunu yapmanın bir yolu olup olmadığını merak ediyorum. Ama internette arama yapmakta olduğum hiçbir ipucu bulamadım ...

cevap

2

Bağlantınızı izleyerek, Michael'ın tarif ettiği şeyi yaptım ve gayet iyi çalışıyor. Muhtemelen, değişikliklerin uygulanmasında bazı hatalar yaptınız. libstdcxx/v6/printers.py şimdi 103 hatlarında olmalıdır - 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))) 

Tür artık benim için çalışıyor,

+0

Teşekkür görüyor. Ama bazı hata ayıklayıcı uyarıları alıyorum: uyarı: 'std :: _ Sp_counted_ptr_inplace >>, (__gnu_cxx :: _ Lock_policy) 2> 'Bu bir sorun olabilir emin değilim – Johannes91

+0

Belki bayrak -fno-rtti kullanarak gcc için RTTI devre dışı bıraktınız? MinGW-w64 64bit gcc sürüm 6.2.0 kullanarak herhangi bir hata ayıklama uyarısı almıyorum. G ++ seçeneklerim -O0 -g3 -Wall -c -fmessage-length = 0 -std = C++ 11 -D_FILE_OFFSET_BITS = 64 -D__WXMSW__ – xamid

+0

Ancak, hata ayıklayıcınız buggy ise, bu gerçekten açıklandığı gibi bir sorun olmamalı. [buradan] (http://stackoverflow.com/questions/12986261/warning-message-rtti-symbol-not-found-when-using-boostiostreams/12991374#12991374). – xamid