Как исключить разделяемую библиотеку из инструментализации с помощью 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).

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