std::unique_ptr
rất đẹp, nhưng tôi thấy chúng kém thoải mái hơn khi gỡ lỗi trong DDD hoặc gdb.Làm thế nào để gỡ lỗi mã C++ 11 với unique_ptr trong DDD (hoặc gdb)?
Tôi đang sử dụng các máy in đẹp gdb là một phần của gcc (ví dụ: /usr/share/gcc-4.8.2/python/libstdcxx/v6/printers.py
). Đó là một chiến thắng lớn cho dễ đọc, ví dụ:
$ print pTest
std::unique_ptr<MyType> containing 0x2cef0a0
Tuy nhiên, dereferencing con trỏ không hoạt động:
$ print *pTest
Could not find operator*.
Khi tôi cần phải truy cập giá trị, tôi phải tự sao chép các con trỏ và đúc nó vào đúng loại, ví dụ:
print *((MyType*) 0x2cef0a0)
Nếu quá trình này vẫn chạy, phiên bản này hoạt động (vẫn xấu xí nhưng tốt hơn):
print *pTest.get() // will not work if analyzing a core dump
Cách tiếp cận đơn giản với Display *pTest
trong DDD cũng không hoạt động. Nó chỉ kết quả trong các lỗi sau:
<error: Could not find operator*.>
Có cách nào để gỡ lỗi C++ 11 mã với unique_ptr trong DDD (mà không vi phạm các quy trình làm việc như tôi làm với cách giải quyết rườm rà của tôi)?
Tôi không ngại sử dụng lệnh gdb, nhưng tích hợp DDD sẽ là điểm cộng. Ví dụ: các con trỏ sau trong cấu trúc dữ liệu bằng cách nhấp đúp vào chúng thường nhanh hơn gõ.
Tôi đã cố gắng để thả máy in đẹp, nhưng nó cũng không phải là tối ưu. Điều tốt nhất mà tôi có thể đưa ra như sau:
print pTest._M_t->_M_head_impl
nghe có vẻ như một câu hỏi ngớ ngẩn, nhưng bạn đã có để xây dựng Trình biên dịch gcc trên hộp của bạn từ đầu? Hay đó là bản cập nhật RPM? Tôi đã có một vấn đề với gdb gần đây khi cố gắng để gỡ lỗi một số mã C + + 11, và thấy tôi không tái biên dịch gdb. Tôi khá chắc chắn đó không phải là trường hợp ở đây, nhưng tôi nghĩ rằng nó có thể có giá trị yêu cầu. – Welshboy
@Welshboy Tôi hiện đang sử dụng gcc 4.8.2 chính thức (20140206) và gdb 7.7 từ Arch Linux. –
Bạn có thể thử điều này: http://stackoverflow.com/questions/322322/displaying-dereferenced-stl-iterators-in-gdb và đặc biệt có một cái nhìn tại một tập tin gdbinit. Dường như có rất nhiều thứ tùy chỉnh bạn có thể làm cho gdb làm. Chúc may mắn. – Ben