Как я могу получить версию 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 +.
Любое понимание поможет тонне!
Ответы
Ответ 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) {}
изменено только второе имя. Я думаю, что это может быть проблемой. И эти предупреждения означают НИЧЕГО. Они означают, что система была перекомпилирована с низким количеством символов отладки.