Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> gdb собственный вывод содержимого объекта 
V
    Опции темы
lamao
Дата 26.7.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 23.4.2008

Репутация: нет
Всего: нет



Меня интересует, можно ли как-то реализовать собственное отображение содержимого объектов в gdb. Например, есть контейнер, который содержит в себе std::list<SomeClass *>.
Можно ли вывести такой контейнер обьектов где-то так:

Код

Container
{
     {A = 1, B = 2}
     {A = 1, B = 3}
}


Пробовал следующую реализацию

Код

const char * Container::print();

Но, если вызвать метод так 
Код

call list.print()

то ничего не выводиться.
А если так 
Код

p list.print()

то выводиться примерно следующее
Код

Container\n{\n{A = 1, B = 2}\n{A = 1, B = 3}\n}\n


Знаю, что, например, в Objective-C можно реализовать метод description и потом в gdb писать
Код

 po someobject


Есть ли схожее решение для С++?

P.S. Вопрос немного не по теме. Как можно загнать вывод g++ в файл  (g++ main.cpp > log.txt) не получается. Все равно он выводит все на консоль.



Это сообщение отредактировал(а) lamao - 26.7.2008, 13:19
PM MAIL WWW   Вверх
JackYF
Дата 26.7.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(lamao @  26.7.2008,  12:16 Найти цитируемый пост)
Как можно загнать вывод g++ в файл  (g++ main.cpp > log.txt) не получается. Все равно он выводит все на консоль.

stdout != stderr. (g++ main.cpp 2> log.txt)


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
lamao
Дата 30.7.2008, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 23.4.2008

Репутация: нет
Всего: нет



В общем после испробование нескольких вариантов решил, что лучший примерно следующий:

Код

class A
{
public:
    const char *description();
    void print();
};

const char *A::description()
{
      std::ostringstream str;
      str << /*нужная информация*/;
}

void A::print()
{ 
      std::cout << this->description();
}


Теперь в gdb можно просто вызвать

Код

call object.print()


Таким образом на основании description можно создавать описание каких угодно котнейнеров и прочих иерархий. К тому же можно создать абстрактный класс с этими двумя методами и наследовть свои классы от него.


Если изобрел велосипед, прошу сильно не ругать

P.S. Для перенаправления вывода об ошибка от g++ в файл нужно (я имею ввиду при работе в консоли)
 
Код

g++ main.cpp &> log.txt




Это сообщение отредактировал(а) lamao - 30.7.2008, 21:26
PM MAIL WWW   Вверх
xvr
Дата 31.7.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Любые варианты печати классом самого себя имеют один явный недостаток - в случае ошибок (как при печати, так и в любом другом месте) вызов метода класса для печати его в лучшем случае напечатает что то не то, а в худшем уронит программу или испортит какие нибудь внутренние данные отлаживаемой программы.
Для печати лучше воспользоваться макросом из gdb, хотя и его придется писать под каждый тип данных  smile 
PM MAIL   Вверх
lamao
Дата 31.7.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 23.4.2008

Репутация: нет
Всего: нет



Цитата(xvr @ 31.7.2008,  11:35)
Для печати лучше воспользоваться макросом из gdb.

А можно поподробнее. Что это за макрос? Как с его помощью организовать вывод своего контейнера объектов? Или где можно почитать про него
PM MAIL WWW   Вверх
xvr
Дата 1.8.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(lamao @ 31.7.2008,  20:09)
Цитата(xvr @ 31.7.2008,  11:35)
Для печати лучше воспользоваться макросом из gdb.

А можно поподробнее. Что это за макрос? Как с его помощью организовать вывод своего контейнера объектов? Или где можно почитать про него

Обычный макрос, через define ... end
(info gdb; 20 Canned Sequences of Commands; 20.1 User-defined commands)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.5138 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.