之前在http://sourceware.org/ml/gdb/2007-06/msg00360.html中提到过。
但是似乎没有人实际实现过这种想法。
实现这一目标是否有障碍?
我的要求如下:
因此,如果已经有这样的解决方案,我想要一个链接,但是如果还没有,我想知道为什么它还没有实现。
可能只是没有人不需要它...但是我认为这对于作为标准进行准备非常有用。
除了将代码组合在一起之外,还需要任何技术或政治问题。
最佳答案
似乎不太难。
$ ./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/