2012-02-01 29 views
6

Tôi đã định cấu hình máy in đẹp bằng cách sử dụng http://wiki.eclipse.org/CDT/User/FAQ#How_can_I_inspect_the_contents_of_STL_containers.3F. Nó hoạt động thành công cho vector và các container khác. Tuy nhiên tôi không thể nhận được để kiểm tra bản đồ như trong ví dụ dưới đây:Máy in đẹp cho các bản đồ ném lỗi loại

#include <map> 
#include <iostream> 

using namespace std; 

int main() 
{ 
map <int, string> mapIntToString; 
map <int, int> mapInt2; 
mapIntToString.insert (map <int, string>::value_type (3, "Three")); 
mapInt2.insert (map <int, int>::value_type (3, 4)); 
return 0; 
} 

tôi nhận được lỗi sau khi in sử dụng gdb:

(gdb) p mapInt2 
$1 = std::map with 1 elementsTraceback (most recent call last): 
File "/home/myuser/opt/gdb_printers/python/libstdcxx/v6/printers.py", line 422, in children 
rep_type = find_type(self.val.type, '_Rep_type') 
File "/home/myuser/opt/gdb_printers/python/libstdcxx/v6/printers.py", line 45, in find_type 
raise ValueError, "Cannot find type %s::%s" % (str(orig), name) 
ValueError: Cannot find type std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int> > >::_Rep_type 
+3

tôi đi xa như tìm ra rằng '_Rep_type' là [ít nhất là trên một số hệ thống] một typedef riêng trong std :: map. giả định của perhap không phải lúc nào cũng đúng. Tôi đề nghị bạn thông báo cho các nhà phát triển các máy in đẹp. –

Trả lời

0

Trên hệ thống của tôi loại _Rep_type không phải là loại nào của std::map (đó là typedef tin) để kịch bản đang cố gắng tìm ra một loại <yourmap>._M_t biến đó là kiểu _Rep_type ...

tôi đã cố gắng:

typedef std::map<int,int> map_t; 
map_t m; 
m.insert(map_t::value_type(3,4)); 

sau đó trong gdb tôi có thể in phím 3 như thế này (sau khi chức năng in từ kịch bản tôi liên kết dưới đây):

p *(int*)(void*)(m._M_t._M_impl._M_header._M_left+1) 

Trường hợp _M_t trong std::map_Rb_tree loại nhưng loại không công khai trên bản đồ (bạn có thể thấy điều đó trong tiêu đề map của mình, cụ thể là <path/to/std-headers/dir/bits/stl_map.h tệp tiêu đề.

Không chắc chắn nếu điều đó giúp một chút, về cơ bản có vẻ như là một vấn đề với hàm python in đẹp mà bạn đang tải.

Tôi vừa cố gắng thêm vào .gdbinit cụ từ GNU GDB Debugger Command Cheat Sheet from yolinux.com (Tôi googled cho gdb pretty print) và với điều đó tôi nhận được đầu ra hợp lý:

(gdb) pmap m int int 
elem[0].left: $3 = 3 
elem[0].right: $4 = 4 
+3

Thực tế là '_Rep_type' là một typedef riêng là không liên quan: GDB biết * tất cả * loại (và typedefs) khi thông tin gỡ lỗi có sẵn. Và 'pmap' là một cách thực sự cũ và clunky để in STL. Python khá máy in được * nhiều * đẹp hơn (khi họ làm việc ;-) –

+0

Vâng, có vẻ như với tôi rằng đối với một số lý do GDB của tôi không 'biết' các loại. Tôi muốn gắn bó với máy in khá python nhưng không biết làm thế nào để khắc phục vấn đề này. '_Rep_type' là riêng tư trong stl_map.h, trong trường hợp của tôi. – agestrada

+0

Tôi đoán đó là vấn đề với tập lệnh python như được chỉ ra ở trên bởi những người khác ... – stefanB

18

gì trình biên dịch (và phiên bản nào), bạn đã sử dụng để xây dựng của bạn nguồn thử nghiệm?

Tôi đoán đây không phải là phiên bản mới nhất của g++. Dưới đây là những gì tôi nhận được với g++ 4.4.3-4ubuntu5:

$ gdb -q ./a.out 
Reading symbols from /tmp/a.out...done. 
(gdb) b 12 
Breakpoint 1 at 0x400de3: file t.cc, line 12. 
(gdb) r 

Breakpoint 1, main() at t.cc:12 
12 return 0; 
(gdb) p mapInt2 
$1 = std::map with 1 elements = {[3] = 4} 

Cập nhật:

Đây là những gì tôi nhận được cho các phiên bản: g ++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

Tôi thấy sự cố. Các hướng dẫn bạn đã tham chiếu là không chính xác.

Đặc biệt, các hướng dẫn gợi ý: svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python, nhưng vấn đề là các mã python đạt thành libstdc++internals, và do đó phải phù hợp với những internals (đây là lý do các máy in khá là một phần của GCC và không một phần của GDB, một thực tế bruce.banner phàn nàn về).

Khi bạn đã làm một tươi svn co ..., bạn nhặt một bản sao của mã python mà không còn phù hợp vớilibstdc++ internals của bạn, và đó là những gì đang gây ra bạn vấn đề này.

Đặc biệt, svn log cho thấy find_type đã được bổ sung ở đây:

r183732 | tromey | 2012-01-30 08:25:11 -0800 (Mon, 30 Jan 2012) | 27 lines 

Đó là nhiều muộn hơn gcc-4.4.3. Những gì bạn muốn làm sau đó, là để có được máy in khá phù hợp với phiên bản lại libstdc++, như vậy:

svn co svn://gcc.gnu.org/svn/gcc/branches/gcc_4_4_3_release/libstdc++-v3/python 

Trừ lệnh trên sẽ không làm việc, bởi vì gcc 4.4.3 ra trước khi máy in khá.

Không có vấn đề, việc thực hiện std::map (và hầu hết phần còn lại của internals STL) đã không thay đổi giữa 4.4.3 và 4.6, và lệnh này không công việc:

svn co svn://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch/libstdc++-v3/python 
+0

Khi tôi xây dựng gdb 7.3 từ nguồn trên Ubuntu 7.3, nó không thể in các phần tử stl theo mặc định, tôi phải cài đặt các máy in đẹp. Bạn không cảm thấy đây là một bước lùi? –

+0

Đây là những gì tôi nhận được cho phiên bản: g ++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3 – agestrada

+0

Cảm ơn bạn đã sử dụng tiếng Nga! Tôi đã có vấn đề này tại nơi làm việc của tôi. Chúng tôi đang sử dụng gcc/g ++ mà đi ra khỏi hộp với RHEL5 và tôi đã gặp khó khăn sau các hướng dẫn về thiết lập PrettyPrinters và tôi đã nhận được cùng một std :: vấn đề bản đồ trước khi giúp đỡ của bạn! – Setheron

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