#python #c #gdb
#python #c #gdb
Вопрос:
Я смотрю на основной файл в gdb. У меня есть std::список указателей на объекты, которые находятся в куче. Отладка с помощью GDB, печать списка возвращает список адресов. Это имеет смысл.
Я могу легко распечатать разыменованный объект первого элемента в списке, т.е. ‘print * $ 1.my_list.front()’. Я хочу видеть содержимое каждого элемента в списке. У меня возникли проблемы с печатью каждого разыменованного элемента. Есть ли прямой способ распечатать каждый разыменованный элемент?
Я бы считал себя новичком в gdb и, как правило, запутался, когда мне нужно его использовать. Я знаю, что в Интернете есть примеры импорта скриптов python, хотя в большинстве примеров показана отладка запущенной программы. Если вам также известны какие-либо хорошие ресурсы для новичка, чтобы узнать больше о лучших практиках gdb, которые были бы наиболее полезны.
Комментарии:
1. Также проверьте исходный код xmethods / pretty printers, чтобы узнать, как можно получить доступ к элементам. (хотя, если xmethods уже доступны, тогда в этом нет необходимости)
Ответ №1:
в gdb есть pretty-printers для большей части стандартной библиотеки, и, следовательно print your_list
, в большинстве случаев этого должно быть достаточно. Однако, поскольку у вас есть список указателей, и вы хотите увидеть объекты, на которые ссылаются ссылки, вам нужно получить один элемент списка, а затем просмотреть его, используя p *your_list.front()
, как вы уже сделали. Для других элементов, помимо первого, вы можете сделать p *(your_list.front() 1)
, p *(your_list.front() 2)
, и т.д. Используя арифметику указателей, подобную этой, вы получаете адрес другого элемента перед его разыменованием.
Вы также можете рассматривать первый элемент как начало массива и видеть весь «массив», используя @SIZE
в адресе. Это специальный синтаксис в gdb для просмотра области памяти в виде массива C. Предположим, вы хотите увидеть первые 4 элемента в списке. Вы можете использовать p *your_list.front()@4
.
Примечание: Основное отличие отладки из основного файла или из запущенной программы заключается в том, что при отладке из основного файла у вас нет запущенного процесса. Это означает, что вы не можете вызывать функции при отладке из основного файла, если в gdb не определен xmethod для метода, который вы пытаетесь вызвать. в gdb также уже определено много xmethod, и именно поэтому вы можете вызывать .front()
, а также другие методы, такие как .size()
в вашем списке.
Комментарии:
1.
front()
просто возвращает ссылку на первый элемент коллекции. Когда оно используется для выполнения таких арифметических действий, какyour_list.front() 1
, это значение не является значением элемента индекса 1.begin()
используется для перебора по списку.