2012-11-10 6 views
2

Инструментарий C Код, связанный с libclntsh Oracle, приводит к сбоям при запуске результирующей программы. Программа завершается сигналом «Незаконная инструкция».Как исключить общую библиотеку из инструментализации с помощью очистки?

Ошибка присутствует, по крайней мере, для некоторых версий Oracle 11g и Purify.

Это known bug and IBM has published a workaround. К сожалению, обходной путь не помогает в моей рабочей среде.

Я использую

$ 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 ... как-то.

ответ

3

С этой версией 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 тогда еще печатает что-то о instrumentalizing 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 

Преимущества:

  • исключить урожайность быстрее раз Инструментализацию если вам просто нужно инструментализировать другие части коды
  • работает около недопустимой команды аварий с Purify и Oracle библиотеками

Неудобство:

  • ошибка памяти внутри исключенной библиотеки (из-за неправильных входных данных для этих функций библиотеки) больше не обнаруживаются.

Purify использует : в качестве разделителя в значениях, поставляемых с опцией -exclude-libs, то есть вы можете указать несколько библиотек для исключения (например, -exclude-libs=foo.so:bar.so).

+0

Любая идея, как сделать вышеприведенную работу с версией Linux Purify? – Raj

+2

@ Радж, нет, я этого не делаю. Но, в Linux, я рекомендую заменить Purify на valgrind и/или GUD's mudflap (или в последней версии GCC заменяющий, дезинфицирующее средство для адреса) и/или дезинфицирующее средство для адресации LLVM clang. – maxschlepzig