2014-02-04 5 views
20

Я пытаюсь отлаживать программу C++ в Eclipse с помощью gdb. Я думаю, что это отлично работает в моей main() функции, но в другом месте он дает мне предупреждение, когда я пытаюсь посмотреть на значение переменной:Как получить домашнюю версию GDB, работающую на Mac OS X?

Failed to execute MI command: 
-data-evaluate-expression variable 
Error message from debugger back end: 
Could not find the frame base for "Class::method()".` 

После рыщут в Интернете, я с трудом понимая, что это ошибка или выяснить, как устранить проблему. Есть несколько других подобных вопросов (here и here), плавающих вокруг переполнения стека.

Поскольку инструменты командной строки Xcode от Apple устаревают (см. gcc и gdb вопросов) Мне нужно было использовать собственные версии для доморощенного. Я не знаю, есть ли что-то в настройке для этих инструментов, которые я мог пропустить.

Я могу отлаживать из командной строки с помощью gdb, и я получаю ту же ошибку: "Could not find the frame base for "Class::method()", поэтому я уверен, что это не проблема с Eclipse.

Что-нибудь выскочит к кому-нибудь, что может вызвать эту проблему?

  • Mac OS X 10.8.5 (Mountain Lion)
  • Затмение 4.2.1 (Juno)
  • GCC 4.8.2 (доморощенной) (с -O0 и -g3)
  • GdB 7.6.2 (доморощенной и codesigned)

Update:

Я также видя строку:

BFD: /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork(i386:x86-64): unknown load command 0x20 

Далее следуют несколько предупреждений:

warning: Could not open OSO archive file "/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/../libsupc++/.libs/libsupc++convenience.a" 
warning: Could not open OSO archive file "/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/../src/c++11/.libs/libc++11convenience.a" 
warning: Could not open OSO archive file "/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/../src/c++98/.libs/libc++98convenience.a" 
warning: `/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/.libs/compatibility-atomic-c++0x.o': can't open to read symbols: No such file or directory. 
warning: `/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/.libs/compatibility-c++0x.o': can't open to read symbols: No such file or directory. 
warning: `/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/.libs/compatibility-chrono.o': can't open to read symbols: No such file or directory. 
warning: `/private/tmp/gcc48-KqoQ/gcc-4.8.2/build/x86_64-apple-darwin12.5.0/libstdc++-v3/src/.libs/compatibility-debug_list-2.o': can't open to read symbols: No such file or directory. 
... 

, который продолжается в течение нескольких линий. Google ищет команду «gdb bfd unknown load», которая показывает множество сайтов без какого-либо решения, но все они, похоже, указывают на то, что может быть конфликт между не-яблочными версиями gdb и Mac OS X 10.8+.

Любое понимание поможет тонне!

+0

Я только что открыл нить о чем-то подобном http://stackoverflow.com/questions/24414707. У меня был успех с использованием XCode 5.1 с llvm-gcc в качестве компилятора и gcc 7.7.1 в качестве отладчика, но мне все еще интересно узнать, как это решить. – Alex

+0

Такая же проблема здесь. Заранее благодарим всех, кто может это решить. – Wizmann

+2

Я не эксперт, но вы можете попробовать скомпилировать флаг -gdwarf-3 и посмотреть, работает ли он. – qutab

ответ

1

Это потому, что имя mangling. Имена схожи с GCC и Clang (они часто имеют сходные механизмы). Манипуляция имени делает его доступным для использования метода C/C++ и процедуры сборки с тем же именем. Посмотрите, что происходит с определением C:

void myfunc() {} 

Мы используем nm для просмотра двоичных имен символов. Используйте nm --demangle, чтобы просмотреть неповрежденные имена. Выход Nm для скомпилированного файла: ... 0000000000000000 T_myfunc ... Количество других символов зависит от уровня отладки, см. Справочную страницу GCC для опций -O и -g. Как видим, есть число. Он шестнадцатеричный. Он имеет восемь цифр на 32-битных машинах и шестнадцать цифр на 64-битных машинах (потому что n-разрядный процессор означает, что n-биты представляют собой указатель, этот символ действительно является указателем внутри двоичного файла). Тогда у нас есть тип символа. Сейчас интересны только два значения: T - это метод C/C++/..., t - это ассемблерная процедура.Смотрите, что происходит, если мы составляем следующий код сборки:

myproc: 

GCC и Clang не должны толкать отладочной при компиляции в сборе, так nm выход будет, вероятно, выглядеть следующим образом:

0000000000000000 t myproc 

имена процедур Ассамблеи являются не искалечен. C++ искалечен, очень странно. Некоторые символы, такие как : или ,, не допускаются в виде символа. Компиляция этого источника C++:

namespace myspace { void myfunc() {} } 

Мы видим выход:

... 
0000000000000000 T __ZN7myspace6myfuncEv 
... 

А главное имя методы никогда не искажается. Если у нас есть следующее:

int main(int argc, char** argv) {} 
int main(std::vector<std::string> args) {} 

только второе имя искалечено. Я думаю, что это может быть проблемой. И эти предупреждения означают НИЧЕГО. Они означают, что система была перекомпилирована с низким количеством символов отладки.

+0

Я не думаю, что это имеет какое-то отношение к искажению. По-видимому, отладочные символы не содержатся в библиотеках на mac os, что смущает gdb. – lionel

Смежные вопросы