MCPcopy Create free account
hub / github.com/MultiFuzz/MultiFuzz / replay_trace

Function replay_trace

hail-fuzz/src/debugging/replay.rs:217–265  ·  view source on GitHub ↗
(mut vm: Vm, mut target: CortexmMultiStream)

Source from the content-addressed store, hash-verified

215}
216
217fn replay_trace(mut vm: Vm, mut target: CortexmMultiStream) -> anyhow::Result<()> {
218 let path_tracer = trace::add_path_tracer(&mut vm, target.mmio_handler.unwrap())?;
219
220 let mut cmplog = None;
221 if icicle_fuzzing::parse_bool_env("REPLAY_CMPLOG")?.unwrap_or(false) {
222 let cmplog_ref =
223 icicle_fuzzing::cmplog2::CmpLog2Builder::new().instrument_calls(true).finish(&mut vm);
224 cmplog_ref.set_enabled(&mut vm.cpu, true);
225 cmplog = Some(cmplog_ref);
226 }
227
228 icicle_fuzzing::add_debug_instrumentation(&mut vm);
229
230 let exit = target.run(&mut vm)?;
231
232 let xpsr = vm.cpu.arch.sleigh.get_varnode("xpsr").unwrap();
233 let active_irq = vm.cpu.read_reg(xpsr) & 0x1ff;
234 eprintln!(
235 "\n[icicle] exited with: {} (icount = {}), active_irq = {active_irq}",
236 target.exit_string(exit),
237 vm.cpu.icount()
238 );
239 eprintln!("[icicle] callstack:\n{}", icicle_vm::debug::backtrace(&mut vm));
240
241 let print_count = match std::env::var("PRINT_LAST_BLOCKS").ok() {
242 Some(c) => c.parse().context("Failed to parse `PRINT_LAST_BLOCKS` environment variable")?,
243 None => 10,
244 };
245 eprintln!("[icicle] last blocks:\n{}", path_tracer.print_last_blocks(&mut vm, print_count));
246
247 let reglist = icicle_vm::debug::get_debug_regs(&vm.cpu);
248 eprintln!("registers:\n{}", icicle_vm::debug::print_regs(&vm, &reglist));
249
250 if let Some(cmplog) = cmplog {
251 log_cmplog_data(&mut vm, cmplog, "cmplog.txt".as_ref())?;
252 }
253 if icicle_fuzzing::parse_bool_env("SAVE_TRACE")?.unwrap_or(true) {
254 let symbolize = icicle_fuzzing::parse_bool_env("SYMBOLIZE_TRACE")?.unwrap_or(false);
255 path_tracer.save_trace(&mut vm, "trace.txt".as_ref(), symbolize);
256 }
257 if icicle_fuzzing::parse_bool_env("SAVE_MMIO_READS")?.unwrap_or(false) {
258 trace::save_mmio_reads("mmio_reads.txt".as_ref(), &path_tracer.get_mmio_reads(&mut vm));
259 }
260 if icicle_fuzzing::parse_bool_env("DEBUG_IL")?.unwrap_or(false) {
261 std::fs::write("il.pcode", icicle_vm::debug::dump_semantics(&vm)?)?;
262 }
263
264 Ok(())
265}
266
267pub fn analyze_crashes(mut config: Config, path: &str) -> anyhow::Result<()> {
268 let features = config::EnabledFeatures::from_env()?;

Callers 1

replayFunction · 0.85

Calls 6

add_path_tracerFunction · 0.85
log_cmplog_dataFunction · 0.85
save_mmio_readsFunction · 0.85
save_traceMethod · 0.80
get_mmio_readsMethod · 0.80
runMethod · 0.45

Tested by

no test coverage detected