对链接到Oracle的libclntsh的C代码进行指令插入会导致在运行生成的程序时崩溃。程序以“非法指令”信号终止。
该bug至少存在于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模式的变体:
-exclude-libs=libclntsh.so.11.1
-exclude-libs=clntsh.so百无所成。
能够排除libclntsh也会大大缩短工具化时间。在这台SPARC机器上,仪表化libclntsh.so需要几分钟时间。
看一下解决方法,它只提到了HPUX -但我希望它也适用于Solaris ...不知何故。
发布于 2013-02-26 03:43:17
对于该版本的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)。
https://stackoverflow.com/questions/13321472
复制相似问题