【发布时间】:2012-05-04 10:24:06
【问题描述】:
我正在尝试在程序运行时对其进行跟踪:使用ptrace(PTRACE_ATTACH, ...)、ptrace(PTRACE_SINGLESTEP, ...) 等。
一切似乎都很好,但是当我使用 CTRL-C 退出我的跟踪程序时,我想将它(使用 PTRACE_DETACH)从被跟踪程序中分离出来,并且当我执行此操作时操作,被跟踪的程序崩溃并出现错误Trace/BPT trap (core dumped)。
我的问题是:我怎样才能在不使被跟踪程序崩溃的情况下正确分离?
这是捕捉SIGINT 信号的函数:
void sig_int()
{
if (ptrace(PTRACE_DETACH, pid, NULL, NULL) == -1)
my_perror("ptrace / DETACH", strerror(errno));
}
编辑:
这里有一些其他的代码:
if ((ptrace(PTRACE_SINGLESTEP, pid, NULL, NULL) == -1))
my_perror("ptrace / SINGLESTEP", strerror(errno));
if (wait4(pid, &(l->status), 0, 0) == -1)
my_perror("wait4", strerror(errno));
if (ptrace(PTRACE_GETREGS, pid, 0, &(l->reg)) == -1)
my_perror("ptrace / GETREGS", strerror(errno));
if ((l->opcode = ptrace(PTRACE_PEEKTEXT, pid, l->reg.rip, NULL)) == -1)
my_perror("ptrace / PEEKTEXT", strerror(errno));
这是我循环的一部分,我在其中进行跟踪的第一部分
【问题讨论】:
-
我一直在寻找错误的根源,并尝试在分离前后等待跟踪的程序,但仍然会发生相同的错误或两个程序之间存在无限循环。