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:
parent
7cacbdcca2
commit
2da02992b7
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue