質問

ほかにもエラーコードとエラー文字列およびログ、その他の特徴は、入させることができ、コードの増しにくデバッグ/トレース情報中のコードを実行することを手助けするデバッグ問題(はかい)実行時に?

役に立ちましたか?

解決

ここでセグメンテーションフォールト時にファイルにスタックトレースを送信するコードの例です。

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <stdarg.h>

static void signal_handler(int);
static void dumpstack(void);
static void cleanup(void);
void init_signals(void);
void panic(const char *, ...);

struct sigaction sigact;
char *progname;

int main(int argc, char **argv){
    char *s;
    progname = *(argv);
    atexit(cleanup);
    init_signals();
    printf("About to seg fault by assigning zero to *s\n");
    *s = 0;
    sigemptyset(&sigact.sa_mask);
    return 0;
}

void init_signals(void){
    sigact.sa_handler = signal_handler;
    sigemptyset(&sigact.sa_mask);
    sigact.sa_flags = 0;
    sigaction(SIGINT, &sigact, (struct sigaction *)NULL);

    sigaddset(&sigact.sa_mask, SIGSEGV);
    sigaction(SIGSEGV, &sigact, (struct sigaction *)NULL);

    sigaddset(&sigact.sa_mask, SIGBUS);
    sigaction(SIGBUS, &sigact, (struct sigaction *)NULL);

    sigaddset(&sigact.sa_mask, SIGQUIT);
    sigaction(SIGQUIT, &sigact, (struct sigaction *)NULL);

    sigaddset(&sigact.sa_mask, SIGHUP);
    sigaction(SIGHUP, &sigact, (struct sigaction *)NULL);

    sigaddset(&sigact.sa_mask, SIGKILL);
    sigaction(SIGKILL, &sigact, (struct sigaction *)NULL);
}

static void signal_handler(int sig){
    if (sig == SIGHUP) panic("FATAL: Program hanged up\n");
    if (sig == SIGSEGV || sig == SIGBUS){
        dumpstack();
        panic("FATAL: %s Fault. Logged StackTrace\n", (sig == SIGSEGV) ? "Segmentation" : ((sig == SIGBUS) ? "Bus" : "Unknown"));
    }
    if (sig == SIGQUIT) panic("QUIT signal ended program\n");
    if (sig == SIGKILL) panic("KILL signal ended program\n");
    if (sig == SIGINT) ;
}

void panic(const char *fmt, ...){
    char buf[50];
    va_list argptr;
    va_start(argptr, fmt);
    vsprintf(buf, fmt, argptr);
    va_end(argptr);
    fprintf(stderr, buf);
    exit(-1);
}

static void dumpstack(void){
    /* Got this routine from http://www.whitefang.com/unix/faq_toc.html
    ** Section 6.5. Modified to redirect to file to prevent clutter
    */
    char dbx[160];
    sprintf(dbx, "echo 'where\ndetach' | dbx -a %d > %s.dump", getpid(), progname);
    system(dbx);
    return;
}

void cleanup(void){
    sigemptyset(&sigact.sa_mask);
    /* Do any cleaning up chores here */
}

は、関数dumpstackでは、dbxは、数年前に、このような私は、AIX上でプログラミングされたときに、このコードが使用されたGNUデバッガのgdbとして、あなたのデバッガを合わせてボックスを変更する必要があります。信号が設定、およびSIGSEGV障害が発生した場合、ハンドラは拡張子.dumpのファイルにスタックをダンプしているかに注意してください。コードセグメンテーションフォールトを示し、スタックトレースをダンプします。

私の好きなコードであること。

希望このことができます、 宜しくお願いします、 トムます。

他のヒント

  • の構築な最適化の保存のために、のどれにも当てはまらない"趣旨"のコードをできるだけ
  • 建築のデバッグモードでは、追加のシンボル情報
  • ないストリップの実行ファイル(Linux/Unixシステムの保していくシンボル情報をできるためのデバッガの使用

がLinuxの場合、印刷することはできる スタック印刷 からの信号ハンドラです。これによりデバッグクラッシュ(SIGSEGV やきシグナルを送るには、プログラムを開始するスタック印刷を行います。 コアダンプ できるとともに進めていくことでデバッグクラッシュ(再びLinuxで共通)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top