之前在http://sourceware.org/ml/gdb/2007-06/msg00360.html中提到过。
但是似乎没有人实际实现过这种想法。
实现这一目标是否有障碍?

我的要求如下:

  • 能够插入任何小精灵二进制可执行文件(例如,通过使用LD_PRELOAD)
  • 二进制文件可以是多线程可执行文件
  • 二进制文件可能链接到包含主函数
  • 的库
  • 除了x86(至少MIPS,ARM,PPC)以外,它还应在各种cpu架构中工作

    因此,如果已经有这样的解决方案,我想要一个链接,但是如果还没有,我想知道为什么它还没有实现。
    可能只是没有人不需要它...但是我认为这对于作为标准进行准备非常有用。

    除了将代码组合在一起之外,还需要任何技术或政治问题。

    最佳答案

    似乎不太难。

    $ ./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;
    }
    

    关于linux - 有人知道有人集成了libsegfault.so和gdbserver以便将gdb即时附加到崩溃的程序上吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1975171/

  • 10-10 07:04