Лучшая переменная, исследующая при отладке кода С++ с помощью Eclipse/CDT

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

ИЗМЕНИТЬ

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

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

Ответ 1

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

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

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

Предпосылки

Установка:

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

    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/С++ > Отладкa > GDB
  • Где он говорит, что GDB Debugger помещает путь к GDB с включенным python, он скорее всего будет в папке mingw/bin с таким именем, как gdb-python27.exe
  • Где сказано, что файл GDB Command File помещает путь к ранее созданному init файлу .gdb.

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

Ответ 2

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

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

  • Отправляйте последние версии принтеров Python libstdС++ в место на своем машина. В локальном каталоге выполните:

        svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
  • Добавьте следующее к своему ~/.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".

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

0) Если у вас нет python GDB, откройте команду shell/command и используйте 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 к вашему 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 init   файлы похожи на "скрипты" команд GDB, которые GBD будет выполнять при загрузке.

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

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

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

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

--OR--

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

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

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

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

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

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

Ответ 6

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

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

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