对与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
与解决方法中描述的一样,我尝试将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 ......不知何故。
答案 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使用:
作为提供给-exclude-libs
选项的值的分隔符,即您可以指定多个要排除的库(例如-exclude-libs=foo.so:bar.so
)。