From 297c08310f8455ee43842a6ce20829097bca1ece Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 2 Mar 2021 00:35:55 -0800 Subject: [PATCH] Enable BPF program instruction traces (#15613) (#15621) (cherry picked from commit 3cd00965a78a91ad0bb00802d725750366ce3fb6) Co-authored-by: Jack May --- Cargo.lock | 1 + program-test/src/lib.rs | 5 ++--- programs/bpf_loader/Cargo.toml | 1 + programs/bpf_loader/src/lib.rs | 10 +++++++++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 540aead96a..4bb3c6c58d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3945,6 +3945,7 @@ dependencies = [ "bincode", "byteorder", "curve25519-dalek 3.0.0", + "log 0.4.11", "num-derive", "num-traits", "rand 0.7.3", diff --git a/program-test/src/lib.rs b/program-test/src/lib.rs index e55fe3cb91..2e7a1bcdbb 100644 --- a/program-test/src/lib.rs +++ b/program-test/src/lib.rs @@ -430,8 +430,7 @@ impl Default for ProgramTest { /// fn default() -> Self { solana_logger::setup_with_default( - "solana_bpf_loader=debug,\ - solana_rbpf::vm=debug,\ + "solana_rbpf::vm=debug,\ solana_runtime::message_processor=debug,\ solana_runtime::system_instruction_processor=trace,\ solana_program_test=info", @@ -523,7 +522,7 @@ impl ProgramTest { /// directory. /// /// If `process_instruction` is provided, the natively built-program may be used instead of the - /// BPF shared object depending on the `bpf` environment variable. + /// BPF shared object depending on the `BPF_OUT_DIR` environment variable. pub fn add_program( &mut self, program_name: &str, diff --git a/programs/bpf_loader/Cargo.toml b/programs/bpf_loader/Cargo.toml index 03e3213ffc..4ee36df97d 100644 --- a/programs/bpf_loader/Cargo.toml +++ b/programs/bpf_loader/Cargo.toml @@ -12,6 +12,7 @@ edition = "2018" bincode = "1.3.1" byteorder = "1.3.4" curve25519-dalek = "3" +log = "0.4.11" num-derive = "0.3" num-traits = "0.2" rand_core = "0.6.2" diff --git a/programs/bpf_loader/src/lib.rs b/programs/bpf_loader/src/lib.rs index acdafe4f08..f6da242b89 100644 --- a/programs/bpf_loader/src/lib.rs +++ b/programs/bpf_loader/src/lib.rs @@ -14,6 +14,7 @@ use crate::{ serialization::{deserialize_parameters, serialize_parameters}, syscalls::SyscallError, }; +use log::{log_enabled, trace, Level::Trace}; use solana_rbpf::{ ebpf::MM_HEAP_START, error::{EbpfError, UserDefinedError}, @@ -83,7 +84,7 @@ pub fn create_and_cache_executor( max_call_depth: bpf_compute_budget.max_call_depth, stack_frame_size: bpf_compute_budget.stack_frame_size, enable_instruction_meter: true, - enable_instruction_tracing: false, + enable_instruction_tracing: log_enabled!(Trace), }, ) .map_err(|e| map_ebpf_error(invoke_context, e))?; @@ -812,6 +813,13 @@ impl Executor for BpfExecutor { before - after, before ); + if log_enabled!(Trace) { + let mut trace_buffer = String::new(); + vm.get_tracer() + .write(&mut trace_buffer, vm.get_program()) + .unwrap(); + trace!("BPF Program Instruction Trace:\n{}", trace_buffer); + } match result { Ok(status) => { if status != SUCCESS {