在进行Parity Substrate运行时开发时,如何打印调试消息以跟踪和检查我的变量?
问问题
1080 次
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 回答