2015-10-07 35 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)過程中的庫函數殺之前停止()返回時,通常只是在系統調用之後的指令。

相關問題