【发布时间】:2014-05-29 17:12:40
【问题描述】:
我无法弄清楚为什么函数每次运行时都会返回“没有这样的过程”错误消息,但只需使用相同的指令内联即可产生所需的输出。
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/user.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
void getregs(pid_t proc, struct user_regs_struct *regs);
int main() {
pid_t proc = fork();
if(proc == 0) {
if(ptrace(PTRACE_TRACEME, 0, NULL, NULL) == -1) {
perror("traceme");
exit(0);
}
if(execl("child", "child", NULL) == -1) {
perror("execl");
exit(0);
}
} else {
wait(&proc);
struct user_regs_struct regs;
ptrace(PTRACE_GETREGS, proc, NULL, ®s);
printf("eax: %08x\n", (unsigned int)regs.eax);
getregs(proc, ®s);
ptrace(PTRACE_CONT, proc, NULL, NULL);
}
return 0;
}
void getregs(pid_t proc, struct user_regs_struct *regs) {
if(ptrace(PTRACE_GETREGS, proc, NULL, ®s) == -1) {
perror("GETREGS");
exit(1);
}
printf("eax: %08x\n", (unsigned int)regs->eax);
}
当我运行它时,我得到了
~$ ./tracer
eax: 0000002f
GETREGS: No such process
我不明白为什么getregs() 返回那个错误。这几乎就像它超出了某事的范围?
另外,有些无关紧要的事情:无论我尝试什么进程,EAX 总是设置为0000002f execl()。这是自然的吗?我不知道我是否正确地分叉了子进程。我需要为此提出一个关于 SO 的新问题吗?
【问题讨论】: