Довольно принтеры для карт, бросающих ошибку типа

Я настроил довольно принтеры, используя http://wiki.eclipse.org/CDT/User/FAQ#How_can_I_inspect_the_contents_of_STL_containers.3F . Он успешно работает для векторных и других контейнеров. Однако я не могу проверить карты, как в приведенном ниже примере:

#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; } 

При печати с использованием 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 

  • строковое представление массива numpy с запятыми, разделяющими его элементы
  • В чем разница между Image.resize и Image.thumbnail в Pillow-Python
  • Единичное и функциональное тестирование приложения на основе PySide?
  • Как вставить matplotlib в pyqt - для чайников
  • Как проверить, находится ли задача уже в очереди python?
  • Разница между переменными_scope и name_scope в TensorFlow
  • Homebrew + Python на mac os x 10.8: Неустранимая ошибка Python: PyThreadState_Get: нет текущей нити, импортирующей mapnik
  • Как выполнить команду командной строки из python
  • 2 Solutions collect form web for “Довольно принтеры для карт, бросающих ошибку типа”

    Какой компилятор (и какая версия) вы использовали для создания своего тестового источника?

    Я предполагаю, что это была не последняя версия g++ . Вот что я получаю с 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} 

    Обновить:

    Это то, что я получаю для версии: g ++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

    Я вижу проблему. Указания, которые вы указали, неверны .

    В частности, инструкции показывают: svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python , но проблема в том, что код python достигает внутренних svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python libstdc++ и, следовательно, должен соответствовать этим внутренностям (вот почему симпатичные принтеры являются частью GCC, а не частью GDB, об этом жаловался bruce.banner).

    Когда вы сделали свежую svn co ... , вы получили копию кода python, которая больше не соответствует вашим внутренним элементам libstdc++ , и именно это вызывает у вас проблемы.

    В частности, svn log показывает, что find_type был добавлен здесь:

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

    Это намного позже, чем gcc-4.4.3 . То, что вы хотите сделать, это получить довольно принтеры, которые соответствуют вашей версии libstdc++ , например:

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

    За исключением вышеприведенной команды не будет работать, потому что gcc 4.4.3 предшествует симпатичным принтерам.

    Независимо от того, реализация std::map (и большая часть остальных внутренних элементов STL) не изменилась между 4.4.3 и 4.6, и эта команда работает:

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

    В моей системе тип _Rep_type не является общедоступным типом std::map (это частный typedef), поэтому скрипт пытается выяснить тип переменной <yourmap>._M_t которая имеет тип _Rep_type

    Я пытался:

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

    то в gdb я могу напечатать ключ 3 как это (после функции печати из сценария, который я связал ниже):

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

    Где _M_t в std::map имеет тип _Rb_tree но тип не является общедоступным на карте (вы можете видеть это в заголовке вашей map , в частности в файле заголовка <path/to/std-headers/dir/bits/stl_map.h .

    Не уверен, что это помогает один бит, в основном, похоже, проблема с красивой функцией python print, которую вы загружаете.

    Я только что попробовал добавить в .gdbinit вещи из GNU GDB Debugger Command Cheat Sheet от yolinux.com (я искал для gdb pretty print версию ), и с этим я получаю разумный вывод:

     (gdb) pmap m int int elem[0].left: $3 = 3 elem[0].right: $4 = 4 
    Python - лучший язык программирования в мире.