У нас есть школьный проект, где нам нужно перекодировать strace.
Нам нужно только перехватывать такие системные вызовы, как запись и чтение, но мы не можем использовать PTRACE_SYSCALL
. Я ищу способ сделать это с помощью PTRACE_SINGLESTEP
, я уже закодировал способ печати системного вызова, и когда я использую PTRACE_SYSCALL
, он работает нормально, но когда я использую PTRACE_SINGLESTEP
, я не могу найти способ только печатать системные вызовы.
Вот код, который я использую, может быть, кто-нибудь поможет мне разобраться, что с ним не так:
pid_t child;
long orig_eax;
user_regs_struct regs;
child = fork();
if (child == 0) {
ptrace(PTRACE_TRACEME, 0, 0, 0);
execve("/home/architek/a.out", {"/home/architek/a.out", NULL}, envp);
} else {
waitpid(child, &status, 0);
while (WIFSTOPPED(status)) {
orig_eax = ptrace(PTRACE_PEEKUSER, child, 8 * ORIG_RAX, NULL);
ptrace(PTRACE_GETREGS, child, NULL, ®s);
call_printer(®s, child);
ptrace(PTRACE_SINGLESTEP, child, 0, 0);
waitpid(child, &status, 0);
}
}
strace
является открытым исходным кодом, вы можете изучить его исходный код. Приведите минимальный воспроизводимый пример - person Basile Starynkevitch   schedule 11.04.2021/usr/include/x86_64-linux-gnu/sys/user.h
- person Basile Starynkevitch   schedule 11.04.2021user.h
, я не могу найти ничего, что помогло бы мне выяснить, остановился ли трассируемый на системном вызове или нет - person Architek   schedule 11.04.2021