Substrate runtime开发中如何打印出tracing message

How to print out tracing message in Substrate runtime development

在进行 Parity Substrate 运行时开发时,如何打印调试消息以跟踪和检查我的变量?

作为Substrate开发的新手,我找到的最直接的方法就是runtime_io::print().

示例:

use runtime_io::{ self };

decl_module! {
  pub struct Module<T: Trait> for enum Call where origin: T::Origin {
    fn deposit_event<T>() = default;

    pub fn my_func(origin) -> Result {
      runtime_io::print("Hello World");
      Ok(());
    }
  }
}

该消息随后将出现在控制台中。快速关注它,因为它一直在滚动。

有关完整示例,请参阅 TCR tutorial example in github

您还可以使用 sp-std 中包含的 if_std! 宏:

https://github.com/paritytech/substrate/pull/2979

if_std! 是一个功能门控,只有当 std 功能启用时才应该是 运行。

例子

sp_std::if_std! {
    // This code is only being compiled and executed when the `std` feature is enabled.
    println!("Hello native world");
}

这样更好,因为您可以 println 变量和其他东西,而不是简单地打印字符串。

以上两个答案本身都是正确的sense/time。这里有一个更准确的概述:

  • runtime_io::print("..."); 已移动。您现在可以使用 sp-runtime::print(). These will be visible in a log target named runtime. So you'd have to do RUST_LOG=runtime=debug. You are still calling into sp_io under the hood though. Also, note that frame_support 中为您重新导出的相同功能。大多数托盘无论如何都需要 frame_support,这使使用更容易。
  • 如果要为 wasm 和本机编译,并且只想为本机执行打印,请使用 sp_std::if_std!{} 宏。
  • 终于可以使用frame_support::debug模块了。该模块提供了上述两个的包装器,使使用更容易,更像 rust-like。与普通记录器类似,您可以使用 debug::native::warn!(...)

最后一个有用的提示是:如果可能,您可以使用 println!SKIP_WASM_BUILD=1 cargo run [xxx] 来膨胀您的代码。当您正在开发并希望在没有上述任何设置的情况下快速调试打印时,这很有用。