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

View File

@ -148,10 +148,23 @@ fn run_program(name: &str) -> u64 {
} }
instruction_count = compute_units_consumed; instruction_count = compute_units_consumed;
if i == 0 { 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 { } else {
let interpreter = trace_log.as_ref().unwrap().as_slice(); 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() { if jit.len() > interpreter.len() {
jit = &jit[0..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 (instruction_count, result) = vm.execute_program(matches.value_of("use").unwrap() != "jit");
let duration = Instant::now() - start_time; let duration = Instant::now() - start_time;
if matches.occurrences_of("trace") > 0 { 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" { if matches.value_of("trace").unwrap() == "stdout" {
analysis analysis
.analyze() .analyze()