2014-04-01 15 views
9

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 
+0

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

+0

@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. –

+1

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

Trả lời

7

Vấn đề này thực sự là không liên quan đến C++ 11, unique_ptr hoặc in ấn đẹp. Vấn đề là gcc không phát ra mã cho std :: unique_ptr :: operator * có thể được gọi bởi gdb để dereference unique_ptr. Ví dụ: nếu bạn thêm *pTest; vào mã của mình thì gdb sẽ thực hiện dereferencing.

Sự cố tương tự được mô tả trong bài đăng SO How to `print`/evaluate c++ template functions in gdb. Hầu như cùng một vấn đề được mô tả cho một auto_ptr tại https://sourceware.org/ml/archer/2012-q1/msg00003.html. Nếu tôi hiểu chính xác thread một cách giải quyết sẽ là để vá các máy in đẹp và cũng in ra con trỏ dereferenced khi in unique_ptr. Bạn có thể tìm thấy báo cáo lỗi gdb tại http://sourceware.org/bugzilla/show_bug.cgi?id=12937.

gdb wiki tại https://sourceware.org/gdb/wiki/STLSupport mô tả các giải pháp in ấn đẹp hơn, có thể có cách giải quyết khác.

Edit: Một giải pháp thanh lịch hơn buộc các trình biên dịch phát ra mã cho tất cả các mẫu thành viên bao gồm nhà điều hành * là để nhanh chóng dứt khoát lớp:

template class std::unique_ptr<MyType>; 
+0

Tôi nên xác định việc khởi tạo rõ ràng này ở đâu? – q0987

+0

Từ quan điểm kỹ thuật trong chính xác một trong các đơn vị dịch của bạn ("tệp cpp") sau khi bao gồm tiêu đề 'bộ nhớ' và sau khi khai báo' MyType' (hoặc bao gồm tương ứng) - xem http: //en.cppreference .com/w/cpp/language/class_template # Explicit_instantiation – user1225999

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