Weiß jemand, ob jemand libsegfault.so und gdbserver integriert hatte, um GDB im laufenden Fliegen an ein abgestürztes Programm anzuhängen?

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

  •  21-09-2019
  •  | 
  •  

Frage

Es wird in erwähnt http://sourceware.org/ml/gdb/2007-06/msg00360.html Vor.
Aber niemand schien diese Art von Idee tatsächlich implementiert zu haben.
Gibt es Hindernisse dafür, dies zu realisieren?

Meine Anforderungen sind die folgenden:

  1. In der Lage sein, an jeder ausführenden Elf -Binärdatei zu platzieren (z. B. mit LD_PRELOAD)
  2. Die Binärdatei kann eine ausführbare Multithread -Datei sein
  3. Die Binärdatei kann mit einer Bibliothek verknüpft, die die Hauptfunktion enthält
  4. Dies sollte in verschiedenen CPU -Architektur als X86 funktionieren (milde, milde, Arm, mindestens PPC)

Wenn es also bereits eine solche Lösung gibt, wollte ich einen Link, aber wenn es noch gibt, wollte ich wissen, warum er nicht bereits als Rad implementiert ist.
Es könnte nur so sein, dass niemand es nicht brauchte ... aber ich denke, das ist sehr nützlich, um sich als Standard vorzubereiten.

Jedes technische oder politische Problem, außer nur zusammen, ist Code gesucht.

War es hilfreich?

Lösung

Scheint nicht zu schwer.

$ ./a.out
Caught signal at 0x400966: Segmentation fault
Segmentation fault
$ GDB_COMM=:1024 ./a.out
Caught signal at 0x400966: Segmentation fault
Attached; pid = 2369
Listening on port 1024
$ gdb ./a.out
Reading symbols from /home/me/a.out...done.
(gdb) target remote :1024
Remote debugging using :1024
#define _XOPEN_SOURCE 500
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
static char *gdb_comm;
static void segv_handler(int sig, siginfo_t *si, void *uc) {
    pid_t child;
    char msg[84], pid[20];
    char *const argv[] = {"gdbserver", gdb_comm, "--attach", pid, NULL};
    sprintf(msg, "Caught signal at %p", si->si_addr);
    psignal(si->si_signo, msg);
    if (gdb_comm && *gdb_comm) {
        switch ((child = fork())) {
        case 0:
            sprintf(pid, "%ld", (long)getppid());
            execvp(argv[0], argv);
            perror("Failed to start gdbserver");
            _exit(-1);
        case -1:
            perror("failed to fork");
        default:
            waitpid(child, NULL, 0);
            break;
        }
    }
}
int main(int argc, char **argv) {
    static struct sigaction segv_action = {
        .sa_sigaction = segv_handler,
        .sa_flags = SA_RESETHAND | SA_SIGINFO,
    };
    gdb_comm = getenv("GDB_COMM");
    sigaction(SIGILL, &segv_action, NULL);
    sigaction(SIGFPE, &segv_action, NULL);
    sigaction(SIGSEGV, &segv_action, NULL);
    sigaction(SIGBUS, &segv_action, NULL);
    *(int *)main = 0;
    return 0;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top