2012-01-09 4 views
16

Я знаю this question, но он не работает для меня. ПрограммаКак связать с debug версиями libc и libstdC++ в GCC?

Для установки, возьмите простой C++, hw.cpp, определяется по формуле: int main() { }

При компиляции с g++ -o hw hw.cpp -O0 -g на Linux, работающий ldd ./hw дает:

linux-gate.so.1 => (0x003e5000) 
    libstdc++.so.6 => /usr/local/lib/libstdc++.so.6 (0x007c5000) 
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x006a4000) 
    libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 (0x00a40000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00a93000) 
    /lib/ld-linux.so.2 (0x00a0f000) 

Теперь я, кажется, есть отладочные библиотеки в /usr/lib/debug/lib/tls/i686/cmov/, которые, я думаю, являются соответствующими отладочными сборками системных библиотек.

Вопрос: Как скомпилировать свою программу так, что она связана с отладочной сборки стандартных библиотек C и/или C++, libc/libm/libstdc++, общий или статический? Для общей сборки я хочу, чтобы вывод ldd ./hw указывал на каталог отладки.

(Справочная информация: Одна из общих библиотек, который используется в моем проекте, как сообщается, как утечка («все еще достижим») по Valgrind, но истоки не в самой общей библиотеке, но в dlopen типа кода (see here .). Таким образом, я понял, что если я могу пошагово _Start() вызова в CRT я мог бы быть в состоянии проследить преступник)

Update/Исправление: Я думаю, что я был просто очень, очень глупо - отладка библиотеки, вероятно, всегда были связаны по желанию. Я был смущен отладчиком, который ничего не показывал, когда ступил, потому что у меня нет нужного исходного кода для библиотек.

Обновление II: ОК, затяните предыдущее обновление. У меня есть источники библиотеки сейчас, но, хотя это правда, что стандартная библиотека поставляется с отладочными символами, у меня нет отдельной отладки build. Является ли такая сборка доступной и как я могу связать ее?

+1

Возможно, вы знаете, что некоторые стандартные реализации библиотек используют пулы для быстрого распределения? http://valgrind.org/docs/manual/faq.html#faq.undeferrors –

+0

@honk: Я полностью согласен с тем, что это не настоящее беспокойство. Меня просто беспокоит то, что сторонний код может вызывать предупреждения в * моем * коде (обратите внимание, что есть только ссылки на некоторые ложные '.c' файлов, которые у меня на самом деле нет, * не * для общей библиотеки), которые я, похоже, не могу подавить ... По крайней мере, с помощью отладочной CRT я надеюсь лучше взглянуть. –

ответ

9

На многих установках Linux библиотеки отладки не содержат реального кода; они содержат только информацию об отладке. Эти два разделены, поэтому вы можете не устанавливать их, если они вам не нужны, и вам не хватает дискового пространства, но библиотеки отладки не подходят сами по себе.

GDB обычно предварительно сконфигурирован для поиска библиотек отладки, когда они вам понадобятся.

Конечно, ваша система может отличаться. Вы не говорите, что это такое.

+0

Вы правы - я действительно связывался с библиотеками отладки. Я был отброшен самой глупой вещью, а именно, что у меня нет стандартного кода библиотеки * source *, поэтому отладчик проходил, но ничего не мог показать! –

+0

На самом деле это все равно не помогает - мне не нужны только символы отладки, но фактическая отладка * сборка библиотеки. Доступно ли это на Debian/Ubuntu? –

+0

Не обычно. Вы абсолютно правы, что обычные оптимизированные библиотеки являются проблемой, если вы хотите пройти через код библиотеки. Конечно, если это просто конкретная библиотека, которую вы хотите, тогда вы всегда можете ее перестроить самостоятельно. 'sudo apt-get build-dep package-name' будет устанавливать все, что вам нужно для сборки, а сами исходные пакеты можно загрузить с помощью' apt-get source package-name'. – ams

0

Ваша программа связана с debug libs.

Только «ldd ./hw» находит libstdC++ в стандартном расположении. Для этого вам необходимо изменить LD_LIBRARY_PATH, чтобы загрузить отладочные библиотеки для загрузки и ldd, чтобы найти их правильно.

+0

Это тоже не работает для меня. Я пробовал несколько вариантов установки этой переменной, но 'ldd' не изменяется. Я знаю, что настройка LD_LIBRARY_PATH работает так, как хорошо работает с другими (несистемными) библиотеками ... или вы говорите, что 'ldd' никогда не будет * отчитывать библиотеку отладки? –

+0

@KerrekSB: Вы пробовали (предполагая bash): 'LD_LIBRARY_PATH =/usr/lib/debug/lib/tls/i686/cmov/ldd./Hw' –

+0

@LokiAstari: Да, попробовал тоже ... безрезультатно , –

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