2015-10-07 25 views
0

进程调用ptrace(PTRACE_TRACEME,...)之后,tracee停止了吗?进程调用ptrace(PTRACE_TRACEME,...)后会发生什么?

是否在exec()系统调用中停止了tracee? (似乎不是)

Tracee是否停留在动态链接器文本中?

...

如果我编译没有任何动态链接库和glibc C运行时一个可执行文件,并指定入口点, 的tracee会停在入口点。

但是当我用glibc编译一个可执行文件(gcc hello-world.c)时,它会停止在/lib/ld-2.20.so offset + 0xfb0。 (cat/proc/[pid]/maps)

希望了解更多细节。

man ptrace似乎没有帮助。

回答

0

当呼叫execve()完成后,tracee通常会停止,这将导致它发送SIGTRAP。
一些用途raise(),以确保信号被发送,就像这样:

ptrace(PTRACE_TRACEME); 
kill(getpid(), SIGSTOP); 
return execvp(args[0], args); 
+0

thx。所以,当tracee停止时,CPU EIP寄存器指向哪条指令? – songhir

+0

好吧,我会说它包含'execve()'系统调用号码,但我不确定,所以你可以用gdb自己检查它,有一个命令('info reg')会告诉你你的进程寄存器的值! – bumblebeez

+0

抱歉,我的含糊不清的陈述。当tracee停止时,CPU EIP寄存器指向一条指令。这条指令是什么?它属于glibc,动态链接器或其他? – songhir

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)过程中的库函数杀之前停止()返回时,通常只是在系统调用之后的指令。

相关问题