Лучшее изучение переменных при отладке кода C ++ с помощью Eclipse / CDT - PullRequest
67 голосов
/ 06 сентября 2010

Использование Eclipse и CDT для отладки кода C ++, переменные окна громоздки и не очень информативны для типов, определенных в стандартной библиотеке шаблонов или в boost (например, shared_ptr).

Просто пример того, как это может выглядеть для std :: vector:

bar {...}   
    std::_Vector_base<TSample<MyTraits>, std::allocator<TSample<MyTraits> > >   
        _M_impl {...}   
            std::allocator<TSample<MyTraits> >  {...}   
            _M_start    0x00007ffff7fb5010  
            _M_finish   0x00007ffff7fd4410  
            _M_end_of_storage   0x00007ffff7fd5010  

Даже если эта информация о внутренностях этих типов может быть полезной, почти во всех случаях я бы ожидал более четкого представления здесь, то есть списка значений для std :: vector. Существуют ли какие-либо инструменты, плагины или другие модификации, которые могут это сделать?

EDIT

Следующие решения не работают для Linux. Я использую Ubuntu 14.04, Eclipse, G ++, GDB.

Я не могу найти пакет gdb-python, и Linux не использует mingw

Ответы [ 6 ]

27 голосов
/ 18 декабря 2012

Вам нужна версия GDB, способная использовать python для красивой печати структур. Я знаю, по крайней мере, в Windows, использующей mingw, что это не предусмотрено при установке по умолчанию.

Pretty Printers - это модули Python, которые сообщают GDB, как отображать данную структуру. Вы можете написать свой собственный, но уже есть принтеры для STL, доступные для скачивания.

Чтобы заставить Pretty Printers работать под Windows (инструкции должны быть аналогичны для других ОС):

Предпосылки

Установка:

  • Откройте командную консоль и введите:

    mingw-get install gdb-python
    
  • Когда закончите CD в локальный каталог и установите принтеры, набрав:

    svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
  • Откройте .gdbinit (при необходимости создайте его в текстовом редакторе) и введите следующий текст, заменив «C: / directory» на папку, в которую вы установили принтеры.

    Python
    import sys
    sys.path.insert (0, 'C: / directory')
    из libstdcxx.v6.printers import register_libstdcxx_printers
    register_libstdcxx_printers (нет)
    конец

Настройка Eclipse

  • Перейдите в Windows> Настройки> C / C ++> Отладка> GDB
  • Там, где говорится, что GDB Debugger указывает путь к GDB с поддержкой Python, он, скорее всего, будет находиться в папке mingw / bin с именем, например gdb-python27.exe
  • Там, где написано: «Командный файл GDB», укажите путь к файлу инициализации .gdb, который вы создали ранее.

Вот и все, отладка как обычно, структуры stl должны быть намного проще для чтения.

21 голосов
/ 01 февраля 2011

Ну, GDB изначально не поддерживает контейнеры STL.Вы не можете сказать, что это неверно, так как это покажет внутреннюю работу объектов STL, но большую часть времени это не то, что мы хотим, верно?

Если вы используете GDB 7.0, вы можетевоспользоваться красивыми принтерами.Этот сайт http://sourceware.org/gdb/wiki/STLSupport содержит довольно простое руководство по их настройке.Ниже я скопировал интересующую вас часть:

  1. Извлеките последние версии принтеров Python libstdc ++ для размещения на вашем компьютере.В локальном каталоге выполните:

        svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
  2. Добавьте следующее в ~ / .gdbinit.Путь должен совпадать с тем, где был извлечен модуль Python выше.Поэтому, если проверено на: / home / maude / gdb_printers /, путь будет таким, как написано в примере:

        python
        import sys
        sys.path.insert(0, '/home/maude/gdb_printers/python')
        from libstdcxx.v6.printers import register_libstdcxx_printers
        register_libstdcxx_printers (None)
        end
    

Путь должен быть единственным элементом, который должен бытьотрегулировано в примере выше.После загрузки классы STL, которые поддерживают принтеры, должны быть напечатаны в более удобном для восприятия формате.Чтобы напечатать классы в старом стиле, используйте переключатель / r (raw) в команде печати (т. Е. Print / r foo).Это выведет классы так, как будто симпатичные принтеры Python не были загружены.

Поскольку вы используете eclipse cdt, не забудьте указать конфигурацию отладки в файле .gdbinit.При создании новой конфигурации отладки перейдите на вкладку «Отладчик» и укажите путь к файлу .gdbinit в поле «Файл команды GDB».

Надеюсь, это поможет!

10 голосов
/ 03 октября 2013

В режиме отладки в списке переменных разверните вектор:

"vector_name" -> std::_Vector_base<"datatype"> -> _M_impl

, затем щелкните правой кнопкой мыши на _M_start и выберите «Показать как массив»... ", введите его длину и нажмите ОК.Теперь вы можете развернуть каждый элемент вашего вектора.

8 голосов
/ 21 декабря 2012

Если у вас есть gdb поддержка CDT (см., Например, GDB в Eclipse ), вы можете попробовать это: Разыменование контейнеров STL

Давным-давно я тоже наткнулся на вашу ту же проблему.Было больно проверять контейнеры STL.Затем я нашел эту ссылку и добавил в свой файл .gdbinit некоторые из этих определений.После этого жизнь стала проще.

ПРИМЕЧАНИЕ: Моя gdb версия - 7.1, и добавление этих определений работает нормально.Я не знаю, включены ли они в более новые версии gdb.

5 голосов
/ 10 января 2013

Я хотел бы расширить ответ Windows 7, потому что некоторые ключевые шаги опущены:

Это для пользователей MinGW с Eclipse CDT

0) Если у вас нет pythonGDB, откройте оболочку / команду и используйте MinGW-get.exe для «установки» Python с поддержкой Python, например

   MinGw-get.exe install gdb-python

1a) Получите Python 2.7.x из http://python.org/download/ и установите

1b) Убедитесь, что PYTHONPATH и PYTHONHOME установлены в вашей среде:

 PYTHONPATH should be C:\Python27\Lib   (or similar)
 PYTHONHOME should be C:\Python27

1c) Добавьте PYTHONHOME к вашей PATH

 %PYTHONHOME%;...

2a) Откройте текст, введите, введитеследующие утверждения.Обратите внимание, что 3-я строка указывает, где расположены скрипты Python.Об этом см. Примечания ниже!

python
import sys
sys.path.insert(0, 'C:/MinGW/share/gcc-4.6.1/python')         
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

2b) Сохранить как «.gdbinit» ПРИМЕЧАНИЕ. Проводник Windows не позволяет назвать файл, имя которого начинается с точки из проводника.Большинство текстовых правок (включая Блокнот) позволит вам.Файлы инициализации GDB похожи на «сценарии» команд GDB, которые GBD будет выполнять при загрузке.

2c) Файл '.gdbinit' должен находиться в рабочем каталоге GDB (скорее всего, это корневой каталог ваших проектов, но ваша IDE может сообщить вам.

3) Откройте Eclipse.(или другой IDE) диалог настроек.Перейдите в подменю C ++ Debugger.

4) Настройте Eclipse для использования C:\MinGW\bin\gdb-python27.exe в качестве отладчика и вашего .gdbinit в качестве файла конфигурации.

5a) Повторно создайте все свои конфигурации запуска отладки (удалите старую и создайте новую с нуля).

--OR--

5b) Отредактируйте каждую конфигурацию отладки и укажите ее нановый gdb-python.exe и укажите его на.

Если у вас возникнут проблемы:

- не забудьте изменить местоположение на каталог python в приведенном выше коде python!Этот каталог создан MinGW, так что не стоит загружать красивые принтеры, MinGW сделал это для вас на нулевом этапе.Просто перейдите к директору установки MinGW, общей папке, папке GCC (имеет номер версии), и вы найдете папку python.Это местоположение должно быть в скрипте Python, загружаемом GDB.

- Кроме того, .gdbinit - это PITA, убедитесь, что его имя указано правильно и в рабочей папке GDB, которая не обязательно находится там, где gdb-python.exe находится!Посмотрите на ваш вывод GDB при загрузке GDB, чтобы увидеть, появляется ли a) «python-enabled» во время загрузки и появляются ли выражения в .gdbinit.

- Наконец, у меня было много проблем с системойпеременные.Если python дает вам «ImportError», то скорее всего вы не установили PYTHONPATH или PYTHONHOME.

- Каталог с 'gdb-python27' (например, C: \ MinGW \ bin ') также должен быть на вашем пути, и если это так, настройка затмения становится немного приятнее, потому что вы этого не делаетенужно поставить в абсолютных путях.Но все же иногда .gbdinit нужен абсолютный путь.если это работает, вы увидите вывод из gbd (console-> gdb traces), как это при запуске отладчика:

835,059 4^done
835,059 (gdb) 
835,059 5-enable-pretty-printing
835,069 5^done
....
835,129 12^done
835,129 (gdb) 
835,129 13source C:\MinGW\bin\.gdbinit
835,139 &"source C:\\MinGW\\bin\\.gdbinit\n"
835,142 13^done
835,142 (gdb) 
2 голосов
/ 06 сентября 2010

Я знаю, что JDT (среда Java в eclipse) предоставляет пользовательские «средства форматирования», которые будут применяться при отображении значений переменных в представлениях отладки.Беглый взгляд на Google для того же в CDT открывает эту страницу:

http://wiki.eclipse.org/CDT/Better_Debugging_%28GSoC_project%29

Я не знаю, интегрировано ли это в основную линию CDT, возможно, выпопробуйте щелкнуть правой кнопкой мыши переменную во время отладки (в последнем CDT) и посмотрите, есть ли пользовательская запись форматера.Если нет в наличии, я рекомендую вам добавить новую запись трекера в CDT трекер, чтобы задать это улучшение.

...