Fixed bug with mishmash of traces from different programs in single log (#29605)

* Fixed bug with mishmash of traces from different programs in single log

* Transformed instructions trace log into the stack of (sub)programs' trace logs
This commit is contained in:
Denis K 2023-01-28 14:03:31 +05:00 committed by GitHub
parent 7cacbdcca2
commit 2da02992b7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 6 deletions

View File

@ -61,7 +61,10 @@ impl std::fmt::Debug for BuiltinProgram {
impl<'a> ContextObject for InvokeContext<'a> {
fn trace(&mut self, state: [u64; 12]) {
self.trace_log.push(state);
self.trace_log_stack
.last_mut()
.expect("Inconsistent trace log stack")
.push(state);
}
fn consume(&mut self, amount: u64) {
@ -104,7 +107,7 @@ pub struct InvokeContext<'a> {
pre_accounts: Vec<PreAccount>,
builtin_programs: &'a [BuiltinProgram],
pub sysvar_cache: Cow<'a, SysvarCache>,
pub trace_log: Vec<[u64; 12]>,
pub trace_log_stack: Vec<Vec<[u64; 12]>>,
log_collector: Option<Rc<RefCell<LogCollector>>>,
compute_budget: ComputeBudget,
current_compute_budget: ComputeBudget,
@ -139,7 +142,7 @@ impl<'a> InvokeContext<'a> {
pre_accounts: Vec::new(),
builtin_programs,
sysvar_cache,
trace_log: Vec::new(),
trace_log_stack: vec![Vec::new()],
log_collector,
current_compute_budget: compute_budget,
compute_budget,
@ -271,12 +274,14 @@ impl<'a> InvokeContext<'a> {
}
}
self.trace_log_stack.push(Vec::new());
self.syscall_context.push(None);
self.transaction_context.push()
}
/// Pop a stack frame from the invocation stack
pub fn pop(&mut self) -> Result<(), InstructionError> {
self.trace_log_stack.pop();
self.syscall_context.pop();
self.transaction_context.pop()
}

View File

@ -148,10 +148,23 @@ fn run_program(name: &str) -> u64 {
}
instruction_count = compute_units_consumed;
if i == 0 {
trace_log = Some(vm.env.context_object_pointer.trace_log.clone());
trace_log = Some(
vm.env
.context_object_pointer
.trace_log_stack
.last()
.expect("Inconsistent trace log stack")
.clone(),
);
} else {
let interpreter = trace_log.as_ref().unwrap().as_slice();
let mut jit = vm.env.context_object_pointer.trace_log.as_slice();
let mut jit = vm
.env
.context_object_pointer
.trace_log_stack
.last()
.expect("Inconsistent trace log stack")
.as_slice();
if jit.len() > interpreter.len() {
jit = &jit[0..interpreter.len()];
}

View File

@ -306,7 +306,13 @@ 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.env.context_object_pointer.trace_log.as_slice();
let trace_log = vm
.env
.context_object_pointer
.trace_log_stack
.last()
.expect("Inconsistent trace log stack")
.as_slice();
if matches.value_of("trace").unwrap() == "stdout" {
analysis
.analyze()