2012-11-10 16 views
2

工具化C代码与Oracle的libclntsh链接导致运行生成的程序时崩溃。该程序以“非法指令”信号终止。如何通过纯化从工具化中排除共享库?

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

这是一个known bug and IBM has published a workaround。不幸的是,解决方法在我的工作环境中无效。

我在Sun SPARC硬件使用

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

的Solaris 10下。我编译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

有了下面的语法去版本分离纯化(在Solaris SPARC 7.0.1-ISH)的工作原理:再

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

净化仍然打印有关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 

优点:

  • 排除收益率更快的工具化时代,如果你只需要工具化代码的其他部位周围的净化和Oracle库非法指令崩溃
  • 作品

缺点:

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

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

+0

任何想法如何使上述工作与Linux版本的Purify? – Raj

+2

@Raj,不,我不知道。但是,在Linux上,我建议使用valgrind和/或GCC的mudflap(或最近的GCC版本中的替换,地址清除程序)和/或LLVM clang的地址清理程序来替换Purify。 – maxschlepzig