Лучшее исследование переменных при отладке кода 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 ответов:
вам нужна версия GDB, способная использовать python для довольно печатных структур. Я знаю, по крайней мере, на windows, используя mingw, что это не предусмотрено в установке по умолчанию.
довольно принтеры модули python, которые говорят gdb, как отобразить данную структуру. Вы можете написать свой собственный, но уже есть принтеры для STL, доступные для загрузки.
чтобы получить довольно принтеры, работающие на Windows (инструкции должны быть аналогичны для других ОС):
предпосылки
убедитесь, что у вас установлен Python 2.7 и в системном пути.
убедитесь, что MinGW-get установлен
http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/
убедитесь, что вы у вас установлен клиент SVN
установка:
Откройте командную строку и введите:
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 имеет довольно простой учебник о том, как их установить. Я скопировал ниже часть, которая вас интересует:
Проверьте последние принтеры Python libstdc++ в месте на вашем машина. В локальном каталоге выполните:
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). Это будет печатать классы, как будто питон довольно-принтеры не были загружены.
поскольку вы используете 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, чтобы спросить это улучшение.