6

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

4

3 回答 3

6

以上两个答案在他们自己的意义上/时间上都是正确的。这是一个更准确的概述:

  • runtime_io::print("...");已被移动。您现在可以使用相同的功能sp-runtime::print()。这些将在名为 的日志目标中可见runtime。所以你必须这样做RUST_LOG=runtime=debug。不过,你仍然sp_io在幕后呼唤。另外,请注意,这frame_support是为您重新导出它。大多数托盘frame_support无论如何都需要,这使得使用更容易。
  • 如果您想为 wasm 和 native 编译,并且只想为本地执行打印,请使用sp_std::if_std!{}宏。
  • 最后,您可以使用frame_support::debug模块。这个模块提供了上述两个的包装器,使使用更容易,更像rust。与普通记录器类似,您可以使用debug::native::warn!(...)etc.

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

于 2020-02-21T08:36:11.900 回答
2

您还可以使用if_std!附带的宏sp-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变量和东西而不是简单地打印字符串。

于 2019-12-12T12:24:06.663 回答
0

作为 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(());
    }
  }
}

然后该消息将出现在控制台中。快速注意它,因为它不断滚动。

完整示例请参考github 中的 TCR 教程示例

于 2019-07-19T09:45:33.350 回答