gần đây tôi đã bắt đầu sử dụng boost tuyệt vời :: unordered_map trên hệ thống của tôi, nhưng có một nhược điểm: Tôi không thể tìm cách kiểm tra nội dung của nó. In nó trên gdb cho tôi một table_ và một buckets_, nhưng không tìm thấy đâu là các mục. Bất cứ ai cũng có một đầu mối về điều này?Pretty printing boost :: unordered_map trên gdb
Trả lời
Đối với những người muốn có máy in, tôi đã quản lý để tạo một máy in. Dưới đây là Code:
class BoostUnorderedMapPrinter:
"prints a boost::unordered_map"
class _iterator:
def __init__ (self, fields):
type_1 = fields.val.type.template_argument(0)
type_2 = fields.val.type.template_argument(1)
self.buckets = fields.val['table_']['buckets_']
self.bucket_count = fields.val['table_']['bucket_count_']
self.current_bucket = 0
pair = "std::pair<%s const, %s>" % (type_1, type_2)
self.pair_pointer = gdb.lookup_type(pair).pointer()
self.base_pointer = gdb.lookup_type("boost::unordered_detail::value_base< %s >" % pair).pointer()
self.node_pointer = gdb.lookup_type("boost::unordered_detail::hash_node<std::allocator< %s >, boost::unordered_detail::ungrouped>" % pair).pointer()
self.node = self.buckets[self.current_bucket]['next_']
def __iter__(self):
return self
def next(self):
while not self.node:
self.current_bucket = self.current_bucket + 1
if self.current_bucket >= self.bucket_count:
raise StopIteration
self.node = self.buckets[self.current_bucket]['next_']
iterator = self.node.cast(self.node_pointer).cast(self.base_pointer).cast(self.pair_pointer).dereference()
self.node = self.node['next_']
return ('%s' % iterator['first'], iterator['second'])
def __init__(self, val):
self.val = val
def children(self):
return self._iterator(self)
def to_string(self):
return "boost::unordered_map"
Trong triển khai bảng băm điển hình, các nhóm chứa đầu của danh sách được liên kết thực sự chứa các giá trị tương ứng với băm cụ thể này. Do đó tôi sẽ đặt cược vào buckets_
.
Tùy chọn khác: có nhiều thư viện máy in khá tốt cho gdb bây giờ, và tôi nghĩ bạn có thể tìm một thư viện hoạt động với C++ 0x và kiểm tra xem nó tìm kiếm giá trị ở đâu.
Chắc chắn, tôi đã kiểm tra thực hiện gcc TR1 và các cấu trúc là khá khác nhau, và một thay thế là không tốt bởi vì tôi đã tìm thấy thúc đẩy thực hiện là nhanh hơn so với người đồng nhiệm tr1 – scooterman
- 1. boost :: uuids :: uuid là khóa trong std :: unordered_map?
- 2. .NET XML Pretty Printer?
- 3. "Pretty thời gian" cho GWT
- 4. C++ boost unordered_map - xác định xem khóa có tồn tại trong vùng chứa
- 5. an toàn thread unordered_map
- 6. "Pretty" Tích hợp liên tục cho Python
- 7. Printing ServerReport mà không xem trước
- 8. Android Cloud Printing with No Dialogs
- 9. C++ Boost trên iPhone
- 10. boost pool_alloc
- 11. Điểm ngắt gdb trên pthread_create
- 12. Sử dụng Boost trên ubuntu
- 13. Xây dựng Boost trên Windows
- 14. C++ - unordered_map complexity
- 15. std :: unordered_map initialization
- 16. Liệu một iterator có lặp lại thông qua boost :: unordered_set hoặc boost :: unordered_map theo thứ tự miễn là tập đó không thay đổi?
- 17. Printing Runtime exec() OutputStream đến bàn điều khiển
- 18. boost :: program_options cho lỗi malloc
- 19. chạy gdb trên máy chủ web
- 20. Python: gỡ lỗi bằng gdb (trên OSX)
- 21. boost :: tokenizer vs boost :: split
- 22. Xây dựng Boost trên Mac với Xcode
- 23. Sử dụng Boost Bimap trong C++
- 24. google :: dense_hash_map vs std :: tr1 :: unordered_map?
- 25. Làm thế nào để làm tăng unordered_map để hỗ trợ hạng ruồi <string>
- 26. Kiểm tra tăng shared_ptr với gdb
- 27. std :: unordered_map chèn với gợi ý
- 28. Cách sử dụng unordered_map trong Android?
- 29. Sử dụng khóa const cho unordered_map
- 30. đối tượng đọc từ const unordered_map
tôi biết Tôi trễ một chút, nhưng làm cách nào để tải (và sử dụng) máy in đẹp này trong GDB? –
Cảm ơn bạn đã đăng bài này. Nó không hoạt động cho các phiên bản sau (tôi đã thử nghiệm trên 1,58+), nhưng tôi đã lấy nó và cập nhật nó vào sáng nay để làm việc với 1.58. Sau một ít thời gian bay, tôi sẽ đóng góp một yêu cầu kéo đến https://github.com/ruediger/Boost-Pretty-Printer nếu điều đó ổn với bạn. –