Как исключить разделяемую библиотеку из инструментализации с помощью cleany?
Инструментирование кода C, связанного с libclntsh Oracle, приводит к сбоям при запуске результирующей программы. Программа завершается сигналом "Незаконная инструкция".
Эта ошибка присутствует по крайней мере в некоторых версиях Oracle 11g и Purify.
Это известная ошибка, и IBM опубликовала обходной путь. К сожалению, обходной путь не помогает в моей рабочей среде.
я использую
$ purify -version
Version 7.0.1.0-002.U 120210 Solaris SPARC
под Solaris 10 на оборудовании Sun SPARC. Я компилирую источник C с помощью Sun CC 11.
Как описано в обходном пути, я попытался исключить libclntsh из инструментализации следующим образом:
$ purify -verbose -cache-dir=purify_cache -always-use-cache-dir \
-selective -exclude-libs=/oracle/app/rdbms/ora11203/lib/libclntsh.so.11.1 \
cc -o myprogram ... -lclntsh
Это не работает. Purify просто говорит, что это инструмент libclntsh.so.11.1, и, конечно же, я получаю соответствующий _pp3_
файл, а не _pp0_
один.
Я попробовал варианты шаблона исключения:
-exclude-libs=libclntsh.so.11.1
-exclude-libs=clntsh.so
Без какого-либо успеха.
Возможность исключить libclntsh также значительно увеличит время инструментализации. На этом компьютере SPARC требуется несколько минут для инструментализации libclntsh.so.
Глядя на обходной путь, он просто упоминает HPUX - но я надеюсь, что он также применим под Solaris ... каким-то образом.
1 ответ
С этой версией Purify (версия 7.0.1 в Solaris SPARC) работает следующий синтаксис:
$ purify -cache-dir=purify_cache -always-use-cache-dir \
-enable-exclude -exclude-libs=libclntsh.so.11.1 cc ...
Затем Purify все еще печатает что-то про инструментализацию libclntsh.so.11.1, но все заканчивается гораздо быстрее и создает _p0_
файл:
$ find purify_cache -name '*_pp0_*'
purify_cache/.../lib/libclntsh.so.11.1_pure_pp0_pc0_0_0_1009171813_510_64
Преимущества:
- исключение дает более быстрое время инструментализации, если вам просто нужно инструментализировать другие части кода
- работает с ошибками Illegal Instruction с библиотеками Purify и Oracle
Недостаток:
- Ошибки памяти внутри исключенной библиотеки (из-за неправильных входных данных для этих библиотечных функций) больше не обнаруживаются.
Очистить использует :
в качестве разделителя в значениях, подаваемых на -exclude-libs
опция, т.е. вы можете указать несколько библиотек для исключения (например, -exclude-libs=foo.so:bar.so
).