Предположим, что есть что-то вроде этого:
#include <map>
int main(){
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0;
}
Я хотел бы иметь возможность проверить содержимое карты, запускающей программу из gdb.
Если я попробую использовать оператор индекса, я получу:
(gdb) p m[1]
Attempt to take address of value not located in memory.
Использование метода поиска не дает лучших результатов:
(gdb) p m.find(1)
Cannot evaluate function -- may be inlined
Есть ли способ добиться этого?
Ответы:
Я думаю, что нет, по крайней мере, если ваш источник оптимизирован и т.д. Однако есть несколько макросов для gdb, которые могут проверять контейнеры STL для вас:
http://sourceware.org/ml/gdb/2008-02/msg00064.html
Однако я этим не пользуюсь, поэтому YMMV
источник
Существующие ответы на этот вопрос очень устарели. В недавних GCC и GDB это Just Works TM благодаря встроенной поддержке Python в GDB 7.x и принтерам libstdc ++ pretty, которые поставляются с GCC.
Для примера OP я получаю:
(gdb) print m $1 = std::map with 2 elements = {[1] = 2, [2] = 4}
Если это не сработает автоматически, вы увидите первый пункт списка поддержки STL странице вики GDB.
Вы также можете написать симпатичные принтеры Python для ваших собственных типов, см. Pretty Printing в руководстве GDB.
источник
Could not find operator[]
.Всегда есть очевидное: определите свою собственную тестовую функцию ... Вызовите ее из gdb. Например:
#define SHOW(X) cout << # X " = " << (X) << endl void testPrint( map<int,int> & m, int i ) { SHOW( m[i] ); SHOW( m.find(i)->first ); } int main() { std::map<int,int> m; m[1] = 2; m[2] = 4; return 0; // Line 15. }
А также:
.... Breakpoint 1 at 0x400e08: file foo.C, line 15. (gdb) run Starting program: /tmp/z/qD Breakpoint 1, main () at qD.C:15 (gdb) call testPrint( m, 2) m[i] = 4 (*m.find(i)).first = 2 (gdb)
источник
stl-views.gdb
Раньше лучший ответ там был, но не больше.Это еще не интегрировано в основную ветку
GDB
, но вот что вы получите, используя ветку archer-tromey-python :(gdb) list 1 #include <map> 2 int main(){ 3 std::map<int,int> m; 4 m[1] = 2; 5 m[2] = 4; 6 return 0; 7 } (gdb) break 6 Breakpoint 1 at 0x8048274: file map.cc, line 6. (gdb) run Breakpoint 1, main () at map.cc:6 6 return 0; (gdb) print m $1 = std::map with 2 elements = { [1] = 2, [2] = 4 } (gdb) quit
источник
Попробуйте удалить ссылки на контейнеры STL: на этой странице: http://www.yolinux.com/TUTORIALS/GDB-Commands.html
источник
Ответы выше работают и в порядке. Если вы используете stl-views.gdb, вот правильный способ просмотра карт и элементов внутри него. Пусть ваша карта будет такой:
std::map<char, int> myMap;
(gdb) pmap myMap char int
т.е.
pmap <variable_name> <left_element_type> <right_element_type>
чтобы увидеть элементы на карте.Надеюсь, это поможет.
источник
Вы можете обойти вторую проблему (
Cannot evaluate function -- may be inlined
), убедившись, что ваш компилятор использует отладочную информацию DWARF-2 (или 3 или 4) при компиляции вашей программы. DWARF-2 включает в себя встраиваемую информацию, поэтому вы должны иметь возможность использовать любой из описанных вами методов для доступа к элементам вашегоstd::map
контейнера.Для компиляции с использованием отладочной информации DWARF-2 добавьте
-gdwarf-2
флаг в свою команду компиляции.источник