2008-11-26 5 views
12

У меня есть итератор к элементу карты, и я бы хотел, чтобы gdb отображал значения «первого» и «второго» элементов этого итератора. Например:Отображение разыменованных STL-итераторов в gdb

std::map<int,double> aMap; 
...fill map... 
std::map<int,double>::const_iterator p = aMap.begin(); 

я могу использовать p.first и p.second в коде, но не может видеть их в БГД. Для чего это стоит, в dbx можно было сделать что-то вроде «print p.node.second_», но я могу найти что-нибудь подобное в gbd.

Я полностью готов иметь функцию, в которую передаю типы объектов, но я не смог заставить это работать.

Любые идеи? Спасибо!

ответ

18

Вот как я это сделать:

This GDB was configured as "i686-pc-linux-gnu"... 
(gdb) list 
1  #include <iostream> 
2  #include <map> 
3 
4  int main() 
5  { 
6   std::map<int, int> a; 
7   a[10] = 9; 
8   std::map<int, int>::iterator it = a.begin(); 
9   ++it; 
10  } 
(gdb) b test.cpp:9 
Breakpoint 1 at 0x8048942: file test.cpp, line 9. 
(gdb) r 
Starting program: /home/js/cpp/a.out 

Breakpoint 1, main() at test.cpp:9 
9   ++it; 
(gdb) set print pretty on 
(gdb) p it 
$1 = { 
    _M_node = 0x94fa008 
} 
(gdb) p *it 
$2 = (class std::pair<const int, int> &) @0x94fa018: { 
    first = 10, 
    second = 9 
} 
(gdb) 
+1

После того, как вы печатаете те, как вы можете ходить другие структуры внутри них (предполагается, что ваш карта содержит указатели на другие вещи)? –

+1

+1 для «set print pretty on» –

+1

Интересно для пар, но как насчет списков (векторов и т. Д.)? –

1

p будет итератора std::pair<const int, double>, так что вы на самом деле хотите, p->first. Я не думаю, что GDB хорошо справляется с перегруженными операторами, поэтому вы, вероятно, хотите p. {некоторый член, который представляет объект pair} .first. Существует Doxygen documentation для libstdC++, поэтому вы можете выяснить, какой член вы хотите, в этом случае он выглядит как ((_Rb_tree_node<pair<const int, double> >*)(p._M_node))-> _M_value_field.first. Поскольку это довольно многословие, я бы проверял, работает ли перегрузка оператора в первую очередь (и нет, я не думаю, что есть что-то более простое, извините). Вы также можете попробовать явно вызывающие операторы, но я не думаю, что gcc может это сделать (например, it.operator*().first).

EDIT: wait, сообщение litb, похоже, показывает, что gcc поддерживает перегрузки оператора на *. Странно, я всегда находил, что это не сработало!

+0

хорошо, это-> сначала здесь не работает :), но * он отлично работает. –

+1

* здесь не работает. Могут быть проблемы с версиями с библиотекой, компилятором и/или gdb (или, возможно, отсутствующим вариантом отладки). – strager

+0

Для меня * это работает, если я заполнил карту, используя [10] = 9, но не если я заполнил карту, используя a.insert (std :: pair (10,9)). Мне кажется очень странным ... – kchoose2

2

Вы можете попробовать Archer, ветку разработки gdb, в первую очередь посвященную улучшению отладки C++. Нажмите here, чтобы увидеть демонстрацию красивого принтера для C++. Этот новый проект также позволяет управлять gdb скриптом python. Основной разработчик, Tom Tromey, написал немало блогов об этом возбужденном проекте.

3

Вы можете использовать р (* его) -> второй

+0

Это самый полезный ответ, который я нашел для фактического доступа к содержимому сложных времен в первой или второй части пары. – Schamp

2

Я понимаю, что это старый вопрос, но я думаю, что я нашел «лучший» ответ на него пока нет. При поиске я наткнулся на файл .gdbinit, который очень сильно меняет типы stl. Есть, по-видимому много версий этого плавающих вокруг, но это самый новый, который я смог найти:

http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt

 Смежные вопросы

  • Нет связанных вопросов^_^