Лучшее исследование переменных при отладке кода C++ с помощью Eclipse / CDT


использование Eclipse и CDT для отладки кода C++ переменная windows является громоздкой и не очень информативной для типов, определенных в стандартной библиотеке шаблонов или в 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::. Есть ли инструменты, плагины или другие модификации, вокруг которых можно это сделать?

EDIT

следующие решения не работают для linux. Я использую ubuntu 14.04, eclipse, g++, gdb.

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

6 65

6 ответов:

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

довольно принтеры модули python, которые говорят gdb, как отобразить данную структуру. Вы можете написать свой собственный, но уже есть принтеры для STL, доступные для загрузки.

чтобы получить довольно принтеры, работающие на Windows (инструкции должны быть аналогичны для других ОС):

предпосылки

установка:

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

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

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

    Python
    импорт Сыс
    системный.путь.вставить(0, 'C:/directory')
    из libstdcxx.v6.принтеры импортируют register_libstdcxx_printers
    register_libstdcxx_printers (нет)
    конец

Eclipse Setup

  • перейдите в Windows > настройки > C / C++ > Debug > GDB
  • где он говорит, что отладчик GDB поставил путь к python включил GDB it скорее всего, будет в папке mingw /bin с именем gdb-python27.exe
  • где он говорит, что командный файл GDB помещает путь к нему .gdb init файл, который вы сделали ранее.

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

Ну, 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). Это будет печатать классы, как будто питон довольно-принтеры не были загружены.

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

Я надеюсь, что помогает!

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

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

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

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

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

Примечание: мой gdb версия 7.1 и добавление этих определений работает нормально. Я не знаю, если в более новых версиях gdb Они уже включены.

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

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

0) Если у вас нет python GDB, откройте оболочку/команду и используйте MinGW-get.exe, чтобы установить GDB с поддержкой 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 к вашему пути

 %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 init файлы похожи на 'Скрипты' команд GDB, которые GBD будет выполнять при загрузке.

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

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

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

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

--OR--

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

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

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

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

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

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

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) 

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

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

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