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 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) => {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue