6

私は現在、PostgreSQL にロードするための共有ライブラリを開発しています (C 言語関数として、こちらを参照してください)。ここで、PostgreSQL 自体を再コンパイルせずに、このライブラリの関数をプロファイリングしたいと思います。

私はcallgrindを使ってみました

valgrind --tool=callgrind path/to/postgres arguments-to-postgres

これにより、PostgreSQL 自体のプロファイリング情報が得られますが、関心のある共有ライブラリをログに記録できません。

も試しsprofましたが、それを機能させる方法がわかりません。

どんなアイデアでも高く評価されます。

PS: デバッガーでアプリケーションを一時停止することはお勧めしません。関数の実行時間が 0.01 秒をはるかに下回る場合、より詳細な結果が必要です。

4

2 に答える 2

2

callgrindの使用は期待どおりに機能するはずです。これをテストするために、単純なライブラリとメインのfunctionMakefileを使用して単純なプロジェクトをセットアップします。

CFLAGS=-fpic
exe:exe.o lib.so
        cc -o exe exe.o lib.so
lib.so:lib.o
        cc -shared lib.o -o lib.so
clean:
        rm -f exe lib.so *.o

lib.cは、次の2つの関数を含む単純なライブラリです。

#include <stdio.h>
void someOtherFunction() { printf("someOtherFunction\n"); }
void someFunction() { printf("someFunction\n"); someOtherFunction(); }

exe.cは非常に単純な実行可能ファイルです。

int someFunction();
void main() { someFunction(); }

Makefileを使用して実行可能ファイルをビルドし、次のようにvalgrindを使用して実行します。

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD valgrind --tool=callgrind ./exe

callgrindの出力を調べると、共有ライブラリに両方の関数のプロファイリングデータがあります。これらの機能が表示されない場合は、この機能をサポートしていない非標準の環境を使用している可能性があります。Linux Mint11x64と最新のパッチを使用しています。

于 2011-07-27T10:17:44.797 に答える
1

ポイント 1: Valgrind には特権エスカレーションに関する問題があるようです。これは Postgres によって実行される可能性が非常に高く、http://www.mail-archive.com/valgrind-users@lists.sourceforge.net/msg02355.htmlを参照してください。

ポイント 2: SL が実際に同じプロセスでロードされていることを (strace などを使用して) 証明しようとしましたか? --trace-children=yes を試みましたか?

ポイント 3: exe.o と exe を -g0 でコンパイルし、dlopen を使用してファイルをロードすることで、テストを変更しようとしました。

すべて: exe lib.so
exe : exe.c
        cc -g0 -o exe exe.c -ldl

lib.so:lib.c
        cc -共有 lib.c -o lib.so
掃除:
        rm -f exe lib.so *.o

#含む
#含む

ボイドメイン(){
    void *ハンドル;
    ボイド (*p)();
    int i;

    ハンドル = dlopen("./lib.so", RTLD_LAZY);
    if ( ! ハンドル ) { printf("オブジェクトが見つかりません\n"); 戻る; }
    p = dlsym(ハンドル、「someFunction」);
    if ( ! p ) { printf("関数が見つかりません\n"); 戻る; }
    for (i = 0; i < 100; ++i) (*p)();
    dlclose(ハンドル);
}

コールグラインドで動作します。Postgres が -ldl を使用してオブジェクト ファイルを開いていないのではないでしょうか?

于 2011-07-29T08:27:34.117 に答える