进程调用ptrace(PTRACE_TRACEME,...)后会发生什么?

时间:2015-10-07 11:38:23

标签: c linux gcc gdb

进程调用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似乎无济于事。

2 个答案:

答案 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()返回之前停止,通常是在系统调用之后的指令处。