問題說明:程序C由一個循環組成。該程序的執行必須由另一個進程控制,該進程將定期顯示受控進程的進度。在kill(pid, SIGSTOP),
之後,功能ptrace(PTRACE_PEEKTEXT,pid,...)
不會再找到C過程。從我讀到的ptrace(PTRACE_PEEKTEXT,pid,...
)當pid
標識的進程停止時應該工作。沒有這樣的過程 - ptrace
我不知道我錯過了什麼,所以任何幫助將不勝感激。以下是我迄今爲止所做的:
有兩個過程,P和C。
第一個過程(P)通過fork()創建第二個(C)。
C'S碼是這樣的:
int i = 0;
int main() {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
printf("Memory address = %p", (void *)&i);
while(1) { i++;}
}
普的代碼如下:
{...}
switch (pid = fork()) {
case 0: /* the child */
if (execl("C", "", (char *) NULL) == -1) {
perror("execl");
}
break;
case -1: /* Error */
perror("fork");
exit(EXIT_FAILURE);
default: /* the parent */
sleep(1);
kill(pid, SIGSTOP);
wait(&status);
if (WSTOPSIG(status)==SIGSTOP) {
printf("%s","Child was interrupted. Insert memory address\n");
scanf("%p",&address);
printf("Address = %p", address);
data = ptrace(PTRACE_PEEKTEXT, pid, address,NULL);
if(data==-1){
if(errno){
printf("%s\n","Error at PEEKTEXT\n");
printf("%s\n",strerror(errno));
}
if(errno == ESRCH){
printf("%s\n","ESRCH error\n");
}
if(errno == EIO){
printf("%s\n","EIO error\n");
}
}
printf("***Data retrieved is: %ld\n",data);
data = ptrace(PTRACE_CONT, pid, 0, 0);
}
if(WIFEXITED(status)){
printf("[Parent] - Child's exit status is: %d \n", WEXITSTATUS(status));
break;
}
break;
}
{...}
的輸出是:
- 從C:存儲器地址= 0x60104c
- 從P:小孩被打斷了。在PEEKTEXT
沒有這樣的進程
ESRCH
錯誤:插入內存地址(下我插入C滌棉什麼)
地址= 0x60104c
而且錯誤是錯誤
***數據檢索我s:-1
適用於我。我添加了必要的包含並定義了所有變量,編譯了P和C並且它工作正常。你能發佈可以編譯的完整代碼嗎?在'...'某處發生錯誤,例如某些變量的類型不正確等?此外,請嘗試運行'strace -f -o strace.log。/ p'並檢查'strace.log'中打印的內容。 – afenster 2014-10-17 20:26:04
你說得對,問題出現在@ ...之中,就像@roxana_roman提到的那樣。 – 2014-10-17 20:45:42