进程调用ptrace(PTRACE_TRACEME,...)之后,tracee停止了吗?
tracee是否在exec()
系统调用中停止? (似乎没有)
tracee是否在动态链接器文本中停止?
...
如果我编译一个没有任何动态链接库和glibc c-runtime的可执行文件,并指定入口点, 跟踪将停留在入口点。
但是当我使用glibc(gcc hello-world.c
)编译可执行文件时,它将停留在/lib/ld-2.20.so offset + 0xfb0
。 (cat / proc / [pid] / maps)
希望了解更多详情。
man ptrace
似乎无济于事。
答案 0 :(得分:0)
当execve()
的呼叫完成后,通常会停止跟踪,这将导致它被发送SIGTRAP。
有些使用raise()
来确保发送信号,如下所示:
ptrace(PTRACE_TRACEME);
kill(getpid(), SIGSTOP);
return execvp(args[0], args);
答案 1 :(得分:0)
kill(getpid(), SIGSTOP); return execvp(args[0], args);
THX。那么,当tracee停止时,CPU EIP寄存器指向哪条指令?
kill(pid_t pid, int sig)
函数的规范解决了这个问题。
如果 pid 的值导致为发送生成 sig 进程,如果没有为调用线程阻止 sig ,如果没有 其他线程 sig 未阻止或正在等待 sigwait()函数 对于 sig , sig 或至少一个待处理的未阻塞信号应为 在 kill()返回之前传递给发送线程。
因此,由于上面的kill(getpid(), SIGSTOP)
过程在库函数 kill()返回之前停止,通常是在系统调用之后的指令处。