5

私は本を​​読んでいます-DavidHansonによる「CInterfacesandImplementations」。この演習の質問は面白そうで、解決策を見つけることができません。

一部のシステムでは、プログラムがエラーを検出したときに、プログラムがそれ自体でデバッガーを呼び出すことができます。この機能は、アサーションの失敗が一般的である可能性がある開発中に特に役立ちます。

デバッガーを呼び出す方法の簡単な例を教えてください。

void handle_seg_fault(int arg)
{
    /* how to invoke debugger from within here */
}

int main()
{
    int *ptr = NULL;
    signal(SIGSEGV, handle_seg_fault);
    /* generate segmentation fault */
    *ptr = 1;
}
4

2 に答える 2

4

Christian.Kのコメントを詳しくfork()説明し、SIGFPEやSIGSEGVのようなものに直面してデバッガーを実行することは、最良のアイデアではない可能性があります。

  1. そもそもプログラムが破損している可能性があり、fork()安全ではありません。
  2. プログラムがハードコーディングしたものとは異なるものをデバッグに使用したい場合があります。
  3. 平均的なアプリケーションユーザーは、デバッガーの処理方法を知りません。
  4. デバッガーに精通している人は、通常、自動呼び出しデバッガーよりもコアダンプを好みます。

テストベッドにコピーできるコアダンプは、顧客の職場のデバッガーインスタンスを1日中いつでも打ち負かします。デバッガーインターフェイスは、お粗末なエンドユーザーエラーメッセージを作成します。

于 2012-07-16T08:12:26.017 に答える
3

私はこれを持っています:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <errno.h>

void exception_handler(int)
{
    int pid = getpid();
    if (fork() != 0) {
        while(true) sleep(1000);
    }
    char buf[20];
    sprintf(buf, "--pid=%u", pid);
    execlp("gdb", "gdb", buf, NULL);
    exit(-1);
}

int init()
{
    if (signal(SIGSEGV, exception_handler) < 0) {
       return errno;
    }
    if (signal(SIGILL, exception_handler) < 0) {
        return errno;
    }
    if (signal(SIGFPE, exception_handler) < 0) {
        return errno;
    }
    return 0;
}

int main()
{
    if (int rc = init()) {
       fprintf(stderr, "init error: %s\n", strerror(rc));
       return 1;
    }
    *((char*)(0)) = 1;
}
于 2012-07-16T07:54:26.963 に答える