2

Oracleのlibclntshに対してリンクされているCコードをインストルメント化すると、結果のプログラムを実行するときにクラッシュが発生します。プログラムは「IllegalInstruction」信号で終了します。

このバグは、Oracle11gおよびPurifyの少なくとも一部のバージョンに存在します。

これは既知のバグであり、IBMは回避策を公開しています。残念ながら、回避策は私の作業環境では役に立ちません。

使ってます

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

SunSPARCハードウェア上のSolaris10で。CソースをSunCC11でコンパイルします。

回避策で説明されているように、私は次のように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_ファイルを取得しますが、1つではありません_pp0_

除外パターンのバリエーションを試しました。

-exclude-libs=libclntsh.so.11.1
-exclude-libs=clntsh.so

成功せずに。

libclntshを除外できることは、インストルメンテーション時間にも大きく影響します。このSPARCマシンでは、libclntsh.soをインストルメント化するのに数分かかります。

回避策を見ると、HPUXについて言及しているだけですが、Solarisでも適用できることを願っています...どういうわけか。

4

1 に答える 1

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

利点:

  • コードの他の部分をインストルメント化する必要がある場合は、excludeを使用するとインストルメンテーション時間が短縮されます
  • PurifyおよびOracleライブラリでの不正な命令のクラッシュを回避します

不利益:

  • 除外されたライブラリ内のメモリエラー(これらのライブラリ関数への誤った入力データによる)は、もはや検出されません。

Purifyは:、オプションに指定された値の区切り文字として使用し-exclude-libsます。つまり、除外する複数のライブラリを指定できます(例-exclude-libs=foo.so:bar.so)。

于 2013-02-25T19:43:16.617 に答える