2012-04-18 36 views
18

gprofを使用してデーモンをプロファイルしたいと思います。私のデーモンは、いくつかのコールバックを登録した第三者のライブラリを使用してから、決して返さないmain関数を呼び出します。デーモンを終了するには、kill(SIGTERMまたはSIGKILLのいずれか)に電話する必要があります。残念ながら、gprofのマニュアルページには、次の言葉:プロセスを強制終了する前にgmon.outを保存する

プロファイルプログラムは、「終了」(2)を呼び出す必要がありますかのgmon.outファイルに保存する プロファイリングについては正常に戻ります。

SIGTERMまたはSIGKILLで強制終了されるプロセスのプロファイリング情報を保存する方法はありますか?

答えて

24

まず、私に良い初期のポインタを与えてくれた@wallykに感謝します。私は次のように私の問題を解決しました。どうやら、libcのgprof出口ハンドラは_mcleanupと呼ばれています。だから、私はSIGUSR1用のシグナルハンドラを登録しました(サードパーティのライブラリでは使われていません)、_mcleanup_exitと呼ばれました。完璧に動作します!コードは次のようになります。

#include <dlfcn.h> 
#include <stdio.h> 
#include <unistd.h> 

void sigUsr1Handler(int sig) 
{ 
    fprintf(stderr, "Exiting on SIGUSR1\n"); 
    void (*_mcleanup)(void); 
    _mcleanup = (void (*)(void))dlsym(RTLD_DEFAULT, "_mcleanup"); 
    if (_mcleanup == NULL) 
     fprintf(stderr, "Unable to find gprof exit hook\n"); 
    else _mcleanup(); 
    _exit(0); 
} 

int main(int argc, char* argv[]) 
{ 
    signal(SIGUSR1, sigUsr1Handler); 
    neverReturningLibraryFunction(); 
} 
+1

また、コンパイラとリンカにいくつかのフラグを追加する必要があります。 g ++の場合、-Wl、 - no-as-needed -ldl -pgを使用する必要があります。出典:http://stackoverflow.com/questions/20369672/undefined-reference-to-dlsym – rkioji

6

サードパーティライブラリがキャッチも無視もしないシグナル用のシグナルハンドラを追加できます。おそらくSIGUSR1は十分ですが、十分に徹底していれば、図書館の資料—を試したり読んだりする必要があります。

シグナルハンドラは単にexit()を呼び出すことができます。

+0

ニースの回答ですが、実際には私の問題は解決しません。サードパーティライブラリはomnithreadを使用し、実行中にミューテックスを保持します。 omn​​iスレッドは、「omni_thread_fatal」のインスタンスを投げた後に 'terminateを呼び出すので、atexitを使って何かを登録するようです。プロセスコアはgmon.outを伴わずにダンプします。 gprofのatexit()フックを直接呼び出すことはできませんか? – user1202136

関連する問題