Печать разыменованных значений из списка в GDB

#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() используется для перебора по списку.