Implemented a strace-like example program

This commit is contained in:
Elnath 2025-05-17 22:32:23 +02:00
parent 7537227636
commit aa661db532
1 changed files with 34 additions and 16 deletions

View File

@ -1,6 +1,7 @@
mod child; mod child;
mod debug_target; mod debug_target;
mod syscall_info; mod syscall_info;
mod syscall_names;
use crate::debug_target::{DebugTarget, Stopped}; use crate::debug_target::{DebugTarget, Stopped};
use color_eyre::eyre::eyre; use color_eyre::eyre::eyre;
@ -29,6 +30,22 @@ fn single_step_all(mut target: DebugTarget<Stopped>) -> color_eyre::Result<()> {
} }
} }
#[allow(dead_code)]
fn strace(mut target: DebugTarget<Stopped>) -> color_eyre::Result<()> {
loop {
match target.cont_syscall()?.wait_for_something()? {
Either::Left(t) => {
println!("{:?}", t.get_syscall_info());
target = t;
}
Either::Right(exit_code) => {
println!("👋 Child exited with code {exit_code}");
return Ok(());
}
}
}
}
#[allow(dead_code)] #[allow(dead_code)]
fn breakpoint_fun(child_pid: Pid) -> color_eyre::Result<()> { fn breakpoint_fun(child_pid: Pid) -> color_eyre::Result<()> {
println!("⏳️ Waiting for child to be ready"); println!("⏳️ Waiting for child to be ready");
@ -83,7 +100,7 @@ fn breakpoint_fun(child_pid: Pid) -> color_eyre::Result<()> {
fn main() -> color_eyre::Result<()> { fn main() -> color_eyre::Result<()> {
color_eyre::install()?; color_eyre::install()?;
let child_exec_path = CString::new(env!("ASM_PROG_PATH"))?; let child_exec_path = CString::new(env!("C_PROG_PATH"))?;
match unsafe { fork() } { match unsafe { fork() } {
Ok(ForkResult::Child) => child::starti(child_exec_path), Ok(ForkResult::Child) => child::starti(child_exec_path),
@ -93,24 +110,25 @@ fn main() -> color_eyre::Result<()> {
let target = DebugTarget::new(child_pid)?; let target = DebugTarget::new(child_pid)?;
println!("✔️ Child ready!"); println!("✔️ Child ready!");
println!("🔎 rip: {:#x}", target.get_registers()?.rip); // println!("🔎 rip: {:#x}", target.get_registers()?.rip);
//
//
println!("⚙️ Executing until next syscall"); // println!("⚙️ Executing until next syscall");
let target = target.cont_syscall()?.wait_for_syscall()?; // let target = target.cont_syscall()?.wait_for_syscall()?;
println!("{:?}", target.get_syscall_info()?); // println!("{:?}", target.get_syscall_info()?);
let target = target.cont_syscall()?.wait_for_syscall()?; // let target = target.cont_syscall()?.wait_for_syscall()?;
println!("{:?}", target.get_syscall_info()?); // println!("{:?}", target.get_syscall_info()?);
println!("🔎 rip: {}", target.get_registers()?.rip); // println!("🔎 rip: {}", target.get_registers()?.rip);
//
println!("⚙️ Continuing execution"); // println!("⚙️ Continuing execution");
let exit_code = target.cont()?.wait_for_exit()?; // let exit_code = target.cont()?.wait_for_exit()?;
println!("👋 Child exited with code {exit_code}"); // println!("👋 Child exited with code {exit_code}");
//
Ok(()) // Ok(())
// single_step_all(target) // single_step_all(target)
strace(target)
// breakpoint_fun(child_pid) // breakpoint_fun(child_pid)
} }
Err(e) => { Err(e) => {