如何使用purify从共享库中排除共享库?

时间:2012-11-10 11:06:19

标签: oracle solaris purify rational-purify

对与Oracle的libclntsh链接的C代码进行操作导致在运行生成的程序时崩溃。该程序以“非法指令”信号终止。

至少某些版本的Oracle 11g和Purify存在该错误。

这是known bug and IBM has published a workaround。不幸的是,解决方法对我的工作环境没有帮助。

我正在使用

$ purify -version
Version 7.0.1.0-002.U 120210 Solaris SPARC
在Sun SPARC硬件上的Solaris 10下。我使用Sun CC 11编译C源代码。

与解决方法中描述的一样,我尝试将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 个答案:

答案 0 :(得分:3)

使用该版本的Purify(Solaris SPARC上的7.0.1-ish),以下选项语法可以正常工作:

$ 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

优点:

    如果您只需要对代码的其他部分进行工具化,
  • 排除产生更快的工具化时间
  • 解决与Purify和Oracle库的非法指令崩溃问题

缺点:

  • 排除的库中的内存错误(因为这些库函数的输入数据错误)不再被检测到。

Purify使用:作为提供给-exclude-libs选项的值的分隔符,即您可以指定多个要排除的库(例如-exclude-libs=foo.so:bar.so)。