Почему Eclipse CDT игнорирует точки останова?

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

Кто-нибудь знает, почему это происходит? Кстати, я использую GDB.

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

Обновлено: решение Ричарда не работает; Спасибо, в любом случае. Я компилирую в Debug без какой-либо оптимизации.

Вы устанавливаете точки останова на «настоящих» строках кода? Под этим я подразумеваю исполняемый код, а не, скажем, строку, содержащую только скобку.

paxdiablo 15.10.2008 15:57

со мной это тоже происходит постоянно; в целом отладчик из Eclipse CDT, к сожалению, очень ненадежный

UncleZeiv 12.02.2009 18:21

Проверьте, скомпилирован ли ваш исполняемый файл с отладочной информацией.

MysticSlayer 15.10.2008 14:42

Как сказано в вопросе, код скомпилирован с отладочной информацией.

Chandrayya G K 24.04.2014 10:24
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
25
4
31 827
12

Ответы 12

«Неразрешенная точка останова» просто означает, что GDB не нашел местоположение кода, соответствующее файлу и строке, в которых вы пытались установить точку останова.

Вы пытаетесь остановиться в конструкторе?

Если это так, вы, вероятно, видите этот недавно исправленный GCC ошибка.

У меня такая же проблема, не могли бы вы мне помочь?

Haider Ali 16.07.2013 00:10

Может быть, вы пытаетесь установить точки останова в еще не загруженной разделяемой библиотеке. Это не сработает, пока библиотека не загрузится. Более новый gdb позволяет устанавливать отложенные точки останова, но это может (пока) не поддерживаться CDT. Обходной путь - установить точку останова в месте, доступном с самого начала, которое будет достигнуто, когда соответствующая разделяемая библиотека уже загружена. Затем установите другую точку останова в общей библиотеке. Теперь должно работать. Это немного утомительнее, но обычно работает.

Из Документация GDB:

For a pending breakpoint whose address is not yet known, this field will contain 'PENDING'. Such breakpoint won't fire until a shared library that has the symbol or line referred by breakpoint is loaded.

Иногда при оптимизации также пропускаются точки останова. Убедитесь, что вы компилируете с -O0

Я обнаружил, что использование F8 (возобновление) не останавливается на моих точках останова. Но, если у меня есть Stop On Startup: main set, тогда перешагните через мой код (F5 / F6), тогда мои точки останова будут достигнуты. У меня нет никаких специальных параметров компилятора, кроме -g или -g3. Надеюсь, что это поможет ...

Убедитесь, что тип точки останова правильный. Для C / C++ это крошечная синяя точка. Если это похоже на что-то еще, скорее всего, тип точки останова неверен. Я бы попытался закрыть файл, щелкнуть по нему правой кнопкой мыши -> открыть с помощью -> Редактор C / C++. Это сработало для меня.

Я обнаружил, что иногда переключение упомянутой программы запуска процессов с «GDB (DSF) Create Process Launcher» на «Standard Create Process Launcher» решает эту проблему для меня. В других случаях достаточно просто удалить все точки останова и перезапустить Eclipse.

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

Смотрите мой вопрос и ответ здесь:

GDB не нарушает работу некоторых строк кода при использовании нескольких исходных файлов.

Вы размещаете точку останова в классе / функции шаблона? Я столкнулся с той же проблемой: я могу выполнять код шаблонов, но точки останова не работают. Я предполагаю, что eclipse не понимает, что он должен размещать точки останова во всех экземплярах этого класса:

template <typename T>
int doit(T a) {
 return a.do(); // <-- breakpoint here
}
...
A a;
cout << doit(a);

Я думаю, он будет ждать doit (...) и никогда не doit (...). По крайней мере, сам gdb останавливается на точке останова, если я устанавливаю его на функцию: 'doit'.

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

Сильвиу

У меня такая же проблема,

1.- Removed the breakpoints. 
2.- Restart eclipse 
3.- Clean the project by using project -> clean 
4.- Add again the breakpoints and start your debugging.

Это решило мою проблему.

У меня тоже была эта проблема, и этого было достаточно, чтобы просто перезапустить eclipse.

user823981 07.07.2015 19:45

ЕСЛИ вы используете GDB в качестве отладчика, убедитесь, что вы используете оба флага: -g и -ggdb

Вы можете либо отредактировать файл make напрямую, либо FCFLAGS = -g -ggdb (могут быть и другие флаги)

или перейдите в «Конфигурация отладки» (она находится в меню, которое выпадает, когда вы щелкаете маленькую стрелку рядом со значком ошибки.) Выберите проект, который вы отлаживаете, и щелкните вкладку отладчика. Убедитесь, что вы используете gdb, и добавьте сюда флаги.

Удивительно, что на этот вопрос так много разных ответов. По-прежнему существует проблема (2020 г.) в Eclipse 2019.12, CDT 9.10, RHEL 8.0, x86_64. В моем случае я могу исправить это, настроив свойства точки останова и изменив его с «обычного» на «аппаратное» (выберите окно точки останова, затем щелкните правой кнопкой мыши точку останова, свойства точки останова, общие, тип).

Другие вопросы по теме