linux - 有谁知道是否有人集成了 libsegfault.so 和 gdbserver 以便将 gdb 即时附加到崩溃的程序?

标签 linux debugging gdb glibc

它在 http://sourceware.org/ml/gdb/2007-06/msg00360.html 中提到之前。
但似乎没有人真正实现过这种想法。
实现这一点有什么障碍吗?

我的要求如下:

  1. 能够插入任何 elf 二进制可执行文件(例如使用 LD_PRELOAD)
  2. 二进制文件可以是多线程可执行文件
  3. 二进制文件可能链接到包含主要功能的库
  4. 这应该适用于 x86 以外的各种 cpu 架构(至少是 MIPS、ARM、PPC)

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

除了将代码放在一起之外,任何技术或政治问题都是需要的。

最佳答案

看起来并不难。

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

相关文章:

debugging - SharePoint 2013 Visual Studio 工作流未更新

c++ - cout 不向控制台打印任何内容

linux - 如何在 GDB 中使用 shell 命令的输出作为 GDB 命令的参数?

linux - GCC 在不同的优化级别上以不同方式处理 float 比较

javascript - Chrome Dev Tools 命中代码但没有断点

linux - 这个linux命令相当于powershell的什么

c++ - 无法在 Qt Creator 中启动 gdb.exe

gdb - gdb 似乎缺少一些方便的功能

linux - 从 LAME 和 FLAC 获取输出以显示在 bash 对话框中

python - 使用 Python 在 Linux 终端中同时运行进程