23

gprof を使用してデーモンのプロファイルを作成したいと考えています。私のデーモンは、いくつかのコールバックを登録するサードパーティのライブラリを使用してから、main返されない関数を呼び出します。killデーモンを終了するには、(SIGTERM または SIGKILL のいずれか)を呼び出す必要があります。残念ながら、gprof のマニュアル ページには次のように書かれています。

プロファイリングされたプログラムは、プロファイリング情報を gmon.out ファイルに保存するために、「exit」(2) を呼び出すか、正常に戻る必要があります。

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

4

2 に答える 2

32

まず、最初に適切な指針を提供してくれた @wallyk に感謝します。私は次のように私の問題を解決しました。どうやら、libc の gprof 終了ハンドラーが呼び出されているよう_mcleanupです。そこで、SIGUSR1 (サードパーティ ライブラリでは未使用) のシグナル ハンドラーを登録し、 and を呼び出し_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();
}
于 2012-04-18T13:10:23.297 に答える
9

サードパーティライブラリがキャッチまたは無視しないシグナルのシグナルハンドラを追加できます。おそらくSIGUSR1で十分ですが、十分に徹底している場合は、実験するか、ライブラリのドキュメントを読む必要があります。

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

于 2012-04-18T08:46:31.253 に答える