From 2cbd5d6c9b2cb7720766967683521a9cb3154266 Mon Sep 17 00:00:00 2001 From: Dmitri Makarov Date: Fri, 31 Mar 2023 15:52:49 -0400 Subject: [PATCH] Output all trace frames instead of last one from rbpf-cli (#31005) --- rbpf-cli/src/main.rs | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/rbpf-cli/src/main.rs b/rbpf-cli/src/main.rs index 820dc492aff048..933c54a3287403 100644 --- a/rbpf-cli/src/main.rs +++ b/rbpf-cli/src/main.rs @@ -20,7 +20,7 @@ use { std::{ fmt::{Debug, Formatter}, fs::File, - io::{Read, Seek}, + io::{Read, Seek, Write}, path::Path, time::{Duration, Instant}, }, @@ -309,27 +309,29 @@ before execting it in the virtual machine.", let (instruction_count, result) = vm.execute_program(matches.value_of("use").unwrap() != "jit"); let duration = Instant::now() - start_time; if matches.occurrences_of("trace") > 0 { - let trace_log = vm + for (frame, trace) in vm .env .context_object_pointer .trace_log_stack - .last() - .expect("Inconsistent trace log stack") - .trace_log - .as_slice(); - if matches.value_of("trace").unwrap() == "stdout" { - analysis - .analyze() - .disassemble_trace_log(&mut std::io::stdout(), trace_log) - .unwrap(); - } else { - analysis - .analyze() - .disassemble_trace_log( - &mut File::create(matches.value_of("trace").unwrap()).unwrap(), - trace_log, - ) - .unwrap(); + .iter() + .enumerate() + { + let trace_log = trace.trace_log.as_slice(); + if matches.value_of("trace").unwrap() == "stdout" { + writeln!(&mut std::io::stdout(), "Frame {frame}").unwrap(); + analysis + .analyze() + .disassemble_trace_log(&mut std::io::stdout(), trace_log) + .unwrap(); + } else { + let filename = format!("{}.{}", matches.value_of("trace").unwrap(), frame); + let mut fd = File::create(filename).unwrap(); + writeln!(&fd, "Frame {frame}").unwrap(); + analysis + .analyze() + .disassemble_trace_log(&mut fd, trace_log) + .unwrap(); + } } } drop(vm);