Eingänge zur Verbesserung des Code debuggability abgesehen von Protokollen und Fehlercodes

StackOverflow https://stackoverflow.com/questions/2177597

  •  24-09-2019
  •  | 
  •  

Frage

Neben Fehlercodes, Fehlerstrings und Protokolle, gibt es andere Merkmale, die in den Code eingebaut werden können, bekommen Debug / Trace-Informationen während der Code-Laufzeit zu erhöhen, die Debug-Ausgaben helfen kann (oder lassen Sie uns wissen, was los ist) zur Laufzeit?

War es hilfreich?

Lösung

Hier ist ein Beispiel für den Code, der einen Stack Trace in einer Datei auf einem Segmentierungsfehler sendet

#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 */
}

In der Funktion dumpstack muss dbx geändert werden, um Ihren Debugger zu entsprechen, wie gdb für das GNU Debugger, dieser Code verwendet wurde, als ich unter AIX Programmierung wurde vor ein paar Jahren boxen. Beachten Sie, wie die Signale eingerichtet sind, und wenn ein SIGSEGV Fehler auftritt, Dumps der Handler den Stapel in eine Datei mit der Erweiterung .dump. Der Code zeigt die Segmentierungsfehler und Dumps die Stacktrace.

Das ist mein Liebling Code.

Hope, das hilft, Freundliche Grüße, Tom.

Andere Tipps

  • Bauen ohne Optimierung, so viel von der „Absicht“ des Codes wie möglich
  • zu erhalten
  • Bauen im Debug-Modus, Symbolinformationen hinzufügen
  • Do Streifen die ausführbare Datei nicht (auf Linux / Unix-Systemen), so viele Symbolinformationen wie möglich zu halten für Debugger zu verwenden

Wenn für Linux Gebäude, Ich mag ein href ausdrucken zu können, ein <= "https://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c -app-Abstürze / 1925461 # 1925461" > Stapel Backtrace von einer Signalbehandlungsroutine. Dies trägt dazu bei Debug-Abstürzen (SIGSEGV) oder ermöglicht es mir, ein Signal an das Programm zu senden, einen Stapel Backtrace zur Laufzeit zu starten. Core-Dumps auch beim Debuggen von Abstürzen nützlich sein kann (wieder in Linux).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top