Implemented a strace-like example program
This commit is contained in:
parent
7537227636
commit
aa661db532
50
src/main.rs
50
src/main.rs
|
|
@ -1,6 +1,7 @@
|
|||
mod child;
|
||||
mod debug_target;
|
||||
mod syscall_info;
|
||||
mod syscall_names;
|
||||
|
||||
use crate::debug_target::{DebugTarget, Stopped};
|
||||
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)]
|
||||
fn breakpoint_fun(child_pid: Pid) -> color_eyre::Result<()> {
|
||||
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<()> {
|
||||
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() } {
|
||||
Ok(ForkResult::Child) => child::starti(child_exec_path),
|
||||
|
|
@ -93,24 +110,25 @@ fn main() -> color_eyre::Result<()> {
|
|||
let target = DebugTarget::new(child_pid)?;
|
||||
println!("✔️ Child ready!");
|
||||
|
||||
println!("🔎 rip: {:#x}", target.get_registers()?.rip);
|
||||
|
||||
|
||||
println!("⚙️ Executing until next syscall");
|
||||
let target = target.cont_syscall()?.wait_for_syscall()?;
|
||||
println!("{:?}", target.get_syscall_info()?);
|
||||
let target = target.cont_syscall()?.wait_for_syscall()?;
|
||||
println!("{:?}", target.get_syscall_info()?);
|
||||
println!("🔎 rip: {}", target.get_registers()?.rip);
|
||||
|
||||
println!("⚙️ Continuing execution");
|
||||
let exit_code = target.cont()?.wait_for_exit()?;
|
||||
println!("👋 Child exited with code {exit_code}");
|
||||
|
||||
Ok(())
|
||||
// println!("🔎 rip: {:#x}", target.get_registers()?.rip);
|
||||
//
|
||||
//
|
||||
// println!("⚙️ Executing until next syscall");
|
||||
// let target = target.cont_syscall()?.wait_for_syscall()?;
|
||||
// println!("{:?}", target.get_syscall_info()?);
|
||||
// let target = target.cont_syscall()?.wait_for_syscall()?;
|
||||
// println!("{:?}", target.get_syscall_info()?);
|
||||
// println!("🔎 rip: {}", target.get_registers()?.rip);
|
||||
//
|
||||
// println!("⚙️ Continuing execution");
|
||||
// let exit_code = target.cont()?.wait_for_exit()?;
|
||||
// println!("👋 Child exited with code {exit_code}");
|
||||
//
|
||||
// Ok(())
|
||||
|
||||
|
||||
// single_step_all(target)
|
||||
strace(target)
|
||||
// breakpoint_fun(child_pid)
|
||||
}
|
||||
Err(e) => {
|
||||
|
|
|
|||
Loading…
Reference in New Issue