#c #linux #gcc #ptrace
#c #linux #gcc #ptrace
Вопрос:
Я хочу отслеживать только часть программы C для системных вызовов. Я использую ptrace () с параметром PTRACE_TRACEME, чтобы начать отслеживание. Как остановить отслеживание этого процесса после нескольких строк кода. Я пытаюсь использовать PTRACE_DETACH, но это не работает?
Основной .Файл C является:
#include<stdio.h>
#include<unistd.h>
#include<sys/ptrace.h>
#include<signal.h>
int display(char *p);
int main()
{
puts("Before Displayn");
display("hello");
puts("After Displayn");
return 0;
}
int display(char *p)
{
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
raise(SIGCONT);
puts("interception");
ptrace(PTRACE_DETACH, 0, NULL, NULL);
return 0;
}
Код родительского процесса является:
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/reg.h> /* For constants ORIG_EAX etc */
#include <stdio.h>
int main()
{ pid_t child;
int status;
long orig_eax;
child = fork();
if(child == 0)
{
execl("/home/kashi/Documents/write", "write", NULL);
}
else {
while(1)
{
wait(amp;status);
if(WIFEXITED(status))
break;
orig_eax = ptrace(PTRACE_PEEKUSER,
child, 4 * ORIG_EAX,
NULL);
printf("The child made a "
"system call %ldn", orig_eax);
ptrace(PTRACE_SYSCALL, child, NULL, NULL);
}
}
return 0;
}
Ответ №1:
Вы не можете сделать это из отслеживаемого процесса.
PTRACE_TRACEME
это единственный запрос, который имеет смысл в отслеживаемом процессе. PTRACE_DETACH
и все остальные должны использоваться в процессе отслеживания.
Отслеживаемый может связаться с трассировщиком и вежливо попросить его отключиться. Специально для этого нет ptrace
запроса. Объект отслеживания может, например, raise(SIGCONT)
, трассировщик заметит это и выдаст PTRACE_DETACH
.
Комментарии:
1. Спасибо, что развеяли сомнения. Не могли бы вы, пожалуйста, предложить какую-нибудь хорошую ссылку для ptrace () и ее использования.