oracle-databasesolarispurifyrational-purify

How to exclude shared library from instrumentalization with purify?


Instrumentalizing C Code that is linked against Oracle's libclntsh leads to crashes when running the resulting program. The program is terminated with a 'Illegal Instruction' signal.

The bug is present for at least some versions of Oracle 11g and Purify.

This is a known bug and IBM has published a workaround. Unfortunately, the workaround does not help in my work environment.

I am using

$ purify -version
Version 7.0.1.0-002.U 120210 Solaris SPARC

under Solaris 10 on Sun SPARC hardware. I compile the C source with Sun CC 11.

Like described in the workaround I've tried excluding libclntsh from instrumentalization like this:

$ 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

This does not work. Purify just says that it is instrumenting libclntsh.so.11.1, and surely enough I get a corresponding _pp3_ file and not a _pp0_ one.

I tried variations of the exclude pattern:

-exclude-libs=libclntsh.so.11.1
-exclude-libs=clntsh.so

Without any success.

Being able to exclude libclntsh would also greatly the instrumentalization time. On this SPARC machine it takes several minutes to instrumentalize libclntsh.so.

Looking at the workaround, it just mentions HPUX - but I hope it is also applicable under Solaris ... somehow.


Solution

  • With that version of Purify (7.0.1-ish on Solaris SPARC) following option syntax works:

    $ purify -cache-dir=purify_cache -always-use-cache-dir \
        -enable-exclude -exclude-libs=libclntsh.so.11.1 cc ...
    

    Purify then still prints something about instrumentalizing libclntsh.so.11.1 but it is finished way faster and creates a _p0_ file:

    $ find purify_cache -name '*_pp0_*'
    purify_cache/.../lib/libclntsh.so.11.1_pure_pp0_pc0_0_0_1009171813_510_64
    

    Advantages:

    Disadvantage:

    Purify uses : as delimiter in values supplied to the -exclude-libs option, i.e. you can specify multiple libraries for exclusion (e.g. -exclude-libs=foo.so:bar.so).