Skip to content

Commit

Permalink
Add function to guess at stack frame
Browse files Browse the repository at this point in the history
  • Loading branch information
mkeeter committed Oct 3, 2024
1 parent 7350c36 commit b311b53
Show file tree
Hide file tree
Showing 41 changed files with 117 additions and 1 deletion.
76 changes: 76 additions & 0 deletions cmd/tasks/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,10 @@ struct TasksArgs {
#[clap(long, short)]
stack: bool,

/// use saved frame pointer to guess at stack trace
#[clap(long, requires = "stack")]
guess: bool,

/// show line number information with stack backtrace
#[clap(long, short, requires = "stack")]
line: bool,
Expand Down Expand Up @@ -193,6 +197,7 @@ fn tasks(context: &mut ExecutionContext) -> Result<()> {
subargs.registers,
subargs.stack,
subargs.line,
subargs.guess,
subargs.spin,
subargs.verbose,
subargs.task,
Expand All @@ -207,6 +212,7 @@ pub fn print_tasks(
registers: bool,
stack: bool,
line: bool,
guess: bool,
spin: bool,
verbose: bool,
task_arg: Option<String>,
Expand Down Expand Up @@ -426,6 +432,29 @@ pub fn print_tasks(
}
Err(e) => {
writeln!(w, " could not read registers: {e:?}")?;
if stack {
if guess {
match stack_guess(
w,
core,
hubris,
t,
&task_value,
&desc,
) {
Ok(stack) => printer.print(hubris, &stack),
Err(e) => writeln!(
w,
" stack unwind failed: {e:?}"
)?,
}
} else {
writeln!(
w,
" use `--guess` to guess at stack trace"
)?;
}
}
}
}
}
Expand Down Expand Up @@ -472,6 +501,53 @@ pub fn print_tasks(
Ok(())
}

fn stack_guess<'a>(
w: &'a mut dyn Write,
core: &'a mut dyn Core,
hubris: &'a HubrisArchive,
t: HubrisTask,
task_value: &'a reflect::Value,
desc: &'a TaskDesc,
) -> Result<Vec<HubrisStackFrame<'a>>> {
writeln!(w, " guessing at stack trace using saved frame pointer")?;
let reflect::Value::Struct(s) = &task_value else {
bail!("invalid type for task_value")
};
let Some(reflect::Value::Struct(save)) = s.get("save") else {
bail!("invalid type for save")
};
let Some(reflect::Value::Base(reflect::Base::U32(addr))) = save.get("r7")
else {
bail!("invalid type for r7")
};
let pc = core.read_word_32(*addr + 4)? & !1;

let mut regs = BTreeMap::new();
regs.insert(ARMRegister::R7, *addr);
regs.insert(ARMRegister::LR, *addr);

// Provide a dummy stack value to pick the
// correct memory region
regs.insert(ARMRegister::SP, desc.initial_stack);

// See if the previous instruction was a branch;
// if so, use that as a fake PC
regs.insert(
ARMRegister::PC,
if let Some(HubrisTarget::Call(t)) =
pc.checked_sub(4).and_then(|pc| hubris.instr_target(pc))
{
t + 4
} else {
pc
},
);

let initial = desc.initial_stack;

hubris.stack(core, t, initial, &regs)
}

#[derive(Copy, Clone, Debug)]
enum Deadline {
Absolute { t: u64, notif: u32 },
Expand Down
3 changes: 2 additions & 1 deletion cmd/test/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,8 @@ fn test(context: &mut ExecutionContext) -> Result<()> {
writeln!(out, "==== Task state")?;

cmd_tasks::print_tasks(
&mut out, core, hubris, false, false, false, false, false, None,
&mut out, core, hubris, false, false, false, false, false, false,
None,
)?;
}
println!("Ran a total of {} cases", ran_cases);
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.kiowa.0.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.kiowa.1.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.kiowa.2.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.kiowa.5.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.0.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.1.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.10.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.11.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.12.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.13.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.14.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.15.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.16.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.17.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.18.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.19.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.2.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.20.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.21.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.22.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.23.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.24.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.25.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.26.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.27.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.29.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.3.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.30.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.33.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.4.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.44.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.5.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tests/cmd/tasks-slvr/tasks-slvr.ouray.6.stdout

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit b311b53

Please sign in to comment.