Подтвердить что ты не робот

Как я могу получить версию GDB на дому в Mac OS X?

Я пытаюсь отлаживать программу С++ в Eclipse с помощью gdb. Я думаю, что он отлично работает в моей функции main(), но в другом месте он дает мне предупреждение, когда я пытаюсь посмотреть на значение переменной:

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

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

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

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

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

  • Mac OS X 10.8.5 (Горный лев)
  • Eclipse 4.2.1 (Juno)
  • gcc 4.8.2 (homebrewed) (с -O0 и -g3)
  • gdb 7.6.2 (зашифровано и закодировано)

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 +.

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

4b9b3361

Ответ 1

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

void myfunc() {}

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

myproc:

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

0000000000000000 t myproc

Имена процедур сборки не искажены. С++ искалечен, очень странно. Некоторые символы, такие как : или ,, не допускаются в имени символа. Скомпилируйте этот источник С++:

namespace myspace { void myfunc() {} }

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

...
0000000000000000 T __ZN7myspace6myfuncEv
...

И имя основного метода никогда не искажается. Если это так:

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

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