2016-02-19 14 views
5

Khi tôi gỡ lỗi ứng dụng C++ 11 của mình, tôi muốn xem các đối tượng unique_ptr và shared_ptr đang trỏ đến. Nhưng bằng cách sử dụng máy in đẹp libstdC++, chỉ một chuỗi có địa chỉ và nội dung tương tự được in, nhưng tôi không thể mở rộng nó để xem nội dung của nó. Tôi đã thử các cách giải quyết sau đây nhưng tôi đã không làm việc cho tôi:Hiển thị con trỏ thông minh trong eclipse cdt bằng cách sử dụng máy in khá gdb

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

Ai có thể giúp tôi với điều đó. Thực ra tôi nghĩ đây có thể là một vấn đề khá cơ bản, vì vậy tôi tự hỏi không có cách nào để làm như vậy. Nhưng tìm kiếm trên internet tôi không thể tìm thấy bất kỳ gợi ý nào ...

Trả lời

2

Theo liên kết của bạn, tôi đã làm chính xác những gì Michael mô tả và nó hoạt động tốt. Có lẽ, bạn đã làm một số sai lầm trong việc áp dụng các thay đổi. Các libstdcxx/v6/printers.py bây giờ sẽ có trong dòng 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))) 

Kind coi

+0

Cảm ơn, nó hoạt động đối với tôi bây giờ. Nhưng tôi nhận được một số cảnh báo trình gỡ rối: cảnh báo: biểu tượng RTTI không tìm thấy cho lớp 'std :: _ Sp_counted_ptr_inplace >, std :: allocator >>, (__gnu_cxx :: _ Lock_policy) 2> 'Tôi không chắc chắn nếu đó có thể là một vấn đề – Johannes91

+0

Có lẽ bạn đã vô hiệu hoá RTTI cho gcc bằng cờ -fno-rtti? Tôi không nhận được bất kỳ cảnh báo trình gỡ lỗi nào, bằng cách sử dụng phiên bản gcc MinGW-w64 64bit 6.2.0. Các tùy chọn g ++ của tôi là -O0 -g3 -Wall -c -fmessage-length = 0 -std = C++ 11 -D_FILE_OFFSET_BITS = 64 -D__WXMSW__ – xamid

+0

Tuy nhiên, nếu trình gỡ rối của bạn bị lỗi, điều này không thực sự là vấn đề như được giải thích [tại đây] (http://stackoverflow.com/questions/12986261/warning-message-rtti-symbol-not-found-when-using-boostiostreams/12991374#12991374). – xamid

Các vấn đề liên quan