Как отлаживать программы на C++0x в MacPorts gcc 4.5?

У меня есть простая программа на С ++, которую я пытаюсь отладить, но GDB не может найти объектный файл для библиотек (или нет доступной отладочной информации), и, похоже, он также не может найти символы отладки для моего исполняемого файла.

Я на OSX 10.5.8, с macports, и я компилирую свой код с

g++-mp-4.5 -Wall -pedantic -std= C++0x -g -ggdb -I/opt/local/include -L/opt/local/lib -lgsl -static-libstdC++ MCMC-simplex.cpp -o mcmc

(есть только один файл, и g ++ - mp-4.5 - исполняемый файл macports для gcc/g++ 4.5)

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

предупреждение: не удалось найти объектный файл "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_gcc45/work/build/i386-apple-darwin9/libgcc/trunctfdf2_ugo доступный для" no " /../../gcc-4.5.0/libgcc/../gcc/config/soft-fp/trunctfdf2.c".

что для меня означает, что у macports есть ошибка во время его сборки (похоже, что gdb ищет объектные файлы во временной директории сборки).

Я должен добавить, что когда я пытаюсь увидеть список своих программ в gdb (который предоставлен Apple), он пытается найти случайный .s файл в /var/tmp, который для меня звучит как файл ассемблера. Вот почему я говорю, что он также не может найти символы отладки для моей программы.

Когда я пробую MacPorts GDB 7.1, я получаю

предупреждение: `/var/folders/Xa/XaqHO9PeEC8K-Nrd0L9xWk+++TM/-Tmp-//cc2IvFto.o': невозможно открыть для чтения символов: такого файла или каталога нет. (символы отладки не найдены)... сделано.

и ни одно из многих сообщений об ошибках, которые выдает GDB от Apple (хотя конечный результат тот же).

Кто-нибудь сталкивался с этой проблемой и придумал решение?

3 ответа

Решение

Что ж, еще один "трюк" для продолжения одного шага компиляции и компоновки - добавить
-save-temps=obj
в вашей командной строке g++, чтобы

4 Удалите /tmp/[random-string].o и.s

фактически не выполняется (на самом деле у вас есть канонические файлы SOURCE.o и SOURCE.s в каталоге, где вы строите вместо RANDOM-STRING.[os] в некоторых временных папках, но с точки зрения найти символы отладки, это нормально

В отличие от других UNIXen, в MacOS отладочная информация не связана с исполняемым файлом. Вместо этого исполняемый файл имеет список объектных файлов, которые были связаны с ним, и отладчик ищет информацию об отладке в этих отдельных объектных файлах.

Если вы удалите объектные файлы, то вы не сможете отладить.

Когда вы компилируете и связываете исполняемый файл в "один шаг", GCC делает это:

  1. Создать файл сборки /tmp/[random-string].s
  2. Соберите это в /tmp/[random-string].o
  3. Ссылка на сайт /tmp/[random-string].o с crt0.o, libcи т. д. в mcmc исполняемый файл.
  4. Удалить /tmp/[random-string].o а также .s

Это последний шаг, который мешает вам отладки.

Решение:

g++-mp-4.5 -Wall -pedantic -std=c++0x -g -ggdb -c MCMC-simplex.cpp
g++-mp-4.5 MCMC-simplex.o -lgsl -static-libstdc++ -o mcmc

Это уйдет MCMC-simplex.o в текущем каталоге, и позволит GDB найти отладочную информацию в нем.

Мне кажется, у вас были две проблемы: 1) нет символов отладки для исполняемого файла и 2) нет символов отладки для некоторых общих библиотек, которые генерировали предупреждения. У меня тоже была проблема 2). Занятый русский ответил 1) и указал мне правильное направление на 2).

Во-первых, если вам не нужно отлаживать библиотеки, упомянутые в предупреждениях, их можно смело игнорировать. Но, конечно, предупреждения раздражают и могут скрывать другие проблемы. В вашем и моем случае библиотеки, установленные MacPorts, должны были удалить символы отладки, но не сделали этого. Причина, по которой возникает предупреждение, заключается в том, как говорит Employed Russian, потому что сами символы хранятся в объектных файлах, созданных в процессе сборки, а не в установленных библиотеках. Библиотеки хранят указатели на объектные файлы как часть их (минимальной) отладочной информации.

Вы можете проверить это с помощью команды strings. Если вы получаете предупреждение о том, что /crazy/path/to/something.o не может быть найдено при загрузке libsomething.dylib:

strings - libsomething.dylib | grep something.o

Обратите внимание, что вам нужно "-" (это я получил в первый раз).

Чтобы исправить это, удалите отладочную информацию примерно так:

strip -S libsomething.dylib

После этого dwarfdump --file-stats libsomething.dylib должен показать, что раздел "STABS debug" пуст. (Ссылки на объектные файлы хранятся в формате отладки STABS.)

Нет больше уродливых предупреждений.. ууу!

Это было слишком сложно.

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