fix waitpid

This commit is contained in:
guochao 2023-11-03 12:17:01 +08:00
parent 0eb915ebeb
commit f52a381372

View File

@ -68,7 +68,13 @@ fn main() -> anyhow::Result<()> {
return Err(err.into()); 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)?; nix::sys::ptrace::cont(child, None)?;
log::trace!("child is ready"); log::trace!("child is ready");
@ -78,9 +84,11 @@ fn main() -> anyhow::Result<()> {
match waitstatus { match waitstatus {
WaitStatus::Exited(pid, ret) => { WaitStatus::Exited(pid, ret) => {
log::info!("child {pid} exited with return code {ret}"); log::debug!("child {pid} exited with return code {ret}");
if pid == child {
break; break;
} }
}
WaitStatus::PtraceEvent(pid, sig, _) => { WaitStatus::PtraceEvent(pid, sig, _) => {
let syscall_nr = nix::sys::ptrace::read_user( let syscall_nr = nix::sys::ptrace::read_user(
pid, pid,
@ -90,16 +98,18 @@ fn main() -> anyhow::Result<()> {
let syscall_name = syscall let syscall_name = syscall
.get_name() .get_name()
.unwrap_or(format!("syscall({syscall_nr})")); .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) { if let Err(err) = writeln!(output, "{} {}", pid.as_raw(), syscall_name) {
log::warn!("failed to write to output file: {err}") log::warn!("failed to write to output file: {err}")
} }
nix::sys::ptrace::cont(pid, None).ok();
} }
_ => {} _ => {
}
if let Some(pid) = waitstatus.pid() { if let Some(pid) = waitstatus.pid() {
nix::sys::ptrace::cont(pid, None)?; nix::sys::ptrace::cont(pid, None).ok();
}
}
} }
} }
return Ok(()); return Ok(());