Ошибка «Источник недоступен для main ()» при отладке простого C ++ в Eclipse с помощью gdb - PullRequest
20 голосов
/ 24 февраля 2010

У меня проблемы с отладкой программы на C ++ в Eclipse (последняя версия RC Helios, обновленная самой последней версией CDT) в OSX.

Программа очень проста (по существу, урок 2 из учебных пособий NeHe по OpenGL), состоит из одного файла cpp и, используя каркасы OpenGL и Cocoa, и связывается с libSDL.a и libSDLmain.a.

Структура проекта очень проста: исходные файлы находятся в подкаталоге проекта с именем src /, а исполняемый файл встроен в корневой каталог проекта.

Проблема заключается в том, что всякий раз, когда я пытаюсь добавить точки останова и отладить их, точки останова, кажется, попадают идеально, но источник не отображается - вместо этого я просто получаю ошибку «Нет доступного источника для main ()» в окне кода.

Для флагов компилятора не заданы значения оптимизации, а для компилятора и компоновщика установлен флаг отладочных символов (-g).

Для параметра отладки в Eclipse задано значение "Стандартные процессы порождения", а для отладчика - "gdb".

Теперь самое странное, что если я попытаюсь отладить точно такой же исполняемый файл - т.е. точно такой же, который был построен Eclipse - используя gdb из терминала (оболочки), тогда все работает нормально. Точки останова достигнуты, исходный код отображается без проблем.

Я убедился, что и Eclipse, и оболочка используют один и тот же исполняемый файл GDB, и они (это /usr/bin/gdb).

Теперь я могу ошибаться, но все это наводит меня на мысль, что не может быть проблемы с флагами компилятора и компоновщика (потому что один и тот же исполняемый файл отлаживаем из оболочки), поэтому, вероятно, проблема должна быть в том, как gdb вызывается из Eclipse? Возможно, при запуске из Eclipse GDB собирает другие файлы конфигурации или что-то еще, чем когда он запускается из оболочки? (Кто-нибудь знает?)

Я бы очень признателен за любую помощь с этим, потому что это медленно сводит меня с ума!

Пожалуйста, дайте мне знать, если были бы полезны какие-либо другие детали - точные номера версий Eclipse / cdt / gdb, точные командные строки компоновщика / компилятора и т. Д. - и я с радостью обновлю этот пост вместе с ними.

Заранее большое спасибо,

thoughton.

--- отредактировано @ "14 часов назад" ---

Я попробовал опцию «добавить путь к файловой системе» (с «поиском в подпапках»), но это не сработало. Я также пытался создать новый совершенно плоский проект, но это тоже не сработало. Я даже пытался получить релиз Galileo (eclipse-SDK-3.5.2RC4 с обновлением CDT), но это не имело никакого значения (кроме того, что gdb медленнее запускался).

И вот еще кое-что странное, что я заметил: как только я получаю сообщение «Источник недоступен», если я затем переключаю консоль Eclipse для отображения консоли «gdb», а также включаю «Режим подробной консоли», чтобы я мог сообщить об этом Затем я могу выполнить команды «l» и «bt» и заставить их работать успешно, показывая правильный источник и стек, где была достигнута моя точка останова. Что, поправьте меня, если я ошибаюсь, должно означать, что информация есть и GDB вызывается правильно - так почему Eclipse не увидит эту информацию?

Я близок к тому, чтобы отказаться от «Затмения», если честно ... Я тоже пришел к нему с такими большими надеждами.

Буду очень признателен за любую дополнительную помощь или мысли.

т.

Ответы [ 12 ]

29 голосов
/ 24 февраля 2010

Эта тема предлагает:

-g -O0

для флагов отладки, которые будут установлены для компиляции Eclipse CDT.
Иногда просто возникает проблема полной перестройки приложения ( как здесь )

См. Также эту ветку , описывающую похожую ситуацию:

Я заметил, что иногда в Eclipse мне нужно идти и специально добавлять путь к моим исходным файлам, используя «add filesystem path» (с «search sub-folders») в диалоге отладки (даже если они находятся в одном проект, который я отлаживаю), но я не заметил шаблон, когда я должен сделать это. Но, возможно, стоит попробовать.

9 голосов
/ 26 февраля 2010

Я нашел ответ! И это смущающе просто.

Проблема заключалась в том, что я использовал Выпускную версию SDL вместо Отладочной версии! (У меня был 'libsdl' от MacPorts, тогда как у меня должен был быть 'libsdl-devel'.)

Итак, мой общий ответ: убедитесь, что библиотеки, на которые вы ссылаетесь, скомпилированы с установленными флагами отладки, не всегда достаточно просто убедиться, что они установлены в вашем собственном коде.

6 голосов
/ 12 сентября 2014

Вот еще одна причина этой проблемы. Моя конфигурация использовала -g3 в качестве опции для gcc. Изменение на -g решило проблему. Кажется, есть некоторая несовместимость между gcc и gdb. Я проверил, что GDB была последней ревизией (используя apt-get).

4 голосов
/ 14 июля 2016

Я бы хотел добавить немного новой крови в эту старую ветку.

Я столкнулся с этой проблемой, когда пытался скомпилировать и отладить проект GNU Arm.

Я решил проблему, изменив Makefile: добавление "-g -O0" в конце этой строки "CFLAGS + = -Wall -Werror -O3"

2 голосов
/ 23 ноября 2013

У меня была эта проблема, когда я компилировал последнюю версию gcc, но не обновил до самой последней версии gdb. После обновления все заработало нормально.

2 голосов
/ 16 августа 2013

Зайдите в свойства проекта, C / C ++ Build -> Settings. На первой вкладке (Настройки инструмента) в кросс-компиляторе GCC нажмите Отладка и установите Максимальный уровень отладки (-g3)

1 голос
/ 31 октября 2017

Следует упомянуть, что в случае, если вы используете cmake для сборки проекта, одним из подходов к решению будет добавление «флага отладки» к команде cmake, т.е. -

$ cmake / path / to / main / cmake_file - DCMAKE_BUILD_TYPE=Debug

1 голос
/ 24 августа 2017

У меня была похожая проблема. Я использовал CFLAGS=-Wall -O2 -fPIC -DPIC -lm -lasound и у меня никогда не было проблем с его компиляцией, но когда я попытался отладить его в Eclipse IDE, я получил эту ошибку: No source available for "main() at 0x401080", затем я добавил -g в эту строку, и она работала хорошо:

CFLAGS = -g -Wall -O2 -fPIC -DPIC -lm -лазун

1 голос
/ 12 июля 2010

Для всех, кто может столкнуться с этой проблемой,

Я установил плагин linuxtools / valgrind прошлой ночью, чтобы выполнить некоторое профилирование памяти, и похоже, что это нарушило нормальный GDB. когда я удалил плагины linuxtools, все снова начало работать как обычно.

Так что вы можете попробовать это.

0 голосов
/ 19 февраля 2019

Я только что столкнулся с этой проблемой и, потратив некоторое время на ее обнаружение, я понимаю, что вкладка Аргументы и Главная в диалоге Конфигурации отладки конфликтуют друг с другом.

Убедитесь, что аргументы приложений и программ C / C ++ указывают на один и тот же двоичный файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...