3

Linuxでstraceが行うように、バイナリからの信号を傍受して追跡する必要があります。実際の strace のような冗長な出力は必要ありません。それがどのように機能するか、信号を傍受する方法、信号を追跡する方法を知りたいだけです。前もって感謝します :)

4

3 に答える 3

3

これは簡単な実装です:

キャッチしたい信号ごとに1つずつ、int main()へのいくつかの呼び出しのどこかに入れます。signal()最初の引数は信号名です。2 番目はシグナル ハンドラ関数です (詳細は以下を参照)。

    signal(SIGFPE, SignalHandler);
    signal(SIGILL, SignalHandler);
    signal(SIGINT, SignalHandler);
    signal(SIGSEGV, SignalHandler);
    signal(SIGTERM, SignalHandler);
#ifndef WIN32
    signal(SIGHUP, SignalHandler);
    signal(SIGQUIT, SignalHandler);
    signal(SIGKILL, SignalHandler);
    signal(SIGPIPE, SignalHandler);
    signal(SIGCHLD, SignalHandler);
#endif

次に、シグナル関数を書きます。void を返し、 int: を受け入れる必要がありますvoid SignalHandler(int signal_number)

void SignalHandler(int signal_number)
{
    printf("Received signal: %s\n", strsignal(signal_number);
    // Do something
}

それでおしまい!raise(SIGNAL_NAME)関数;を使用して自分自身にシグナルを送信してテストすることもできます。たとえば、試してみてくださいraise(SIGTERM);

于 2009-12-20T12:11:06.513 に答える
0

他のプロセスへのシグナルを傍受することは、デバッグ以外の理由で行うべきではありません。これが strace の目的です。プロセスは、独自のシグナルを処理できる必要があります。

言うまでもなく、デバッガーを作成している場合は、ptrace() を理解してください。

于 2009-12-20T12:14:42.437 に答える