2012-11-10 56 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