From f52a381372ea84d9fd01a36362eb611696e9e731 Mon Sep 17 00:00:00 2001 From: guochao Date: Fri, 3 Nov 2023 12:17:01 +0800 Subject: [PATCH] fix waitpid --- src/main.rs | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main.rs b/src/main.rs index 14e4c60..6f6eb57 100644 --- a/src/main.rs +++ b/src/main.rs @@ -68,7 +68,13 @@ fn main() -> anyhow::Result<()> { return Err(err.into()); } }; - nix::sys::ptrace::setoptions(child, Options::PTRACE_O_TRACESECCOMP | Options::PTRACE_O_TRACECLONE | Options::PTRACE_O_TRACEFORK | Options::PTRACE_O_TRACEVFORK)?; + nix::sys::ptrace::setoptions( + child, + Options::PTRACE_O_TRACESECCOMP + | Options::PTRACE_O_TRACECLONE + | Options::PTRACE_O_TRACEFORK + | Options::PTRACE_O_TRACEVFORK, + )?; nix::sys::ptrace::cont(child, None)?; log::trace!("child is ready"); @@ -78,8 +84,10 @@ fn main() -> anyhow::Result<()> { match waitstatus { WaitStatus::Exited(pid, ret) => { - log::info!("child {pid} exited with return code {ret}"); - break; + log::debug!("child {pid} exited with return code {ret}"); + if pid == child { + break; + } } WaitStatus::PtraceEvent(pid, sig, _) => { let syscall_nr = nix::sys::ptrace::read_user( @@ -90,16 +98,18 @@ fn main() -> anyhow::Result<()> { let syscall_name = syscall .get_name() .unwrap_or(format!("syscall({syscall_nr})")); - log::info!("parent: child {pid} received signal {sig:?} syscall: {syscall_name}({syscall_nr})"); + log::debug!("parent: child {pid} received signal {sig:?} syscall: {syscall_name}({syscall_nr})"); if let Err(err) = writeln!(output, "{} {}", pid.as_raw(), syscall_name) { log::warn!("failed to write to output file: {err}") } + nix::sys::ptrace::cont(pid, None).ok(); + } + _ => { + if let Some(pid) = waitstatus.pid() { + nix::sys::ptrace::cont(pid, None).ok(); + } } - _ => {} - } - if let Some(pid) = waitstatus.pid() { - nix::sys::ptrace::cont(pid, None)?; } } return Ok(());