开发者工具
本节详细描述了 Taichi 开发者常用的工具。
日志
Taichi 使用 spdlog 作为其日志系统。 日志可以有从低到高的不同等级,分别是:
等级 |
---|
trace |
debug |
info |
warn |
error |
日志等级越高,日志信息就越严重。
默认日志等级是 info
。 你可以通过下面的方式覆盖默认的日志级别:
- 设置环境变量,例如
export TI_LOG_LEVEL=warn
。 - 在 Python 内设置日志级别:
ti.set_logging_level(ti.WARN)
。
在 Python中,你可以使用 ti.*
接口来写日志:
# Python
ti.trace("Hello world!")
ti.debug("Hello world!")
ti.info("Hello world!")
ti.warn("Hello world!")
ti.error("Hello world!")
在 C++ 中,你可以使用 TI_*
接口写入日志:
// C++
TI_TRACE("Hello world!");
TI_DEBUG("Hello world!");
TI_INFO("Hello world!");
TI_WARN("Hello world!");
TI_ERROR("Hello world!");
如果一个等级为 error
的信息被抛出,Taichi将会被立刻终止并在 Python 中报 RuntimeError
错误。
// C++
int func(void *p) {
if (p == nullptr)
TI_ERROR("The pointer cannot be null!");
// will not reach here if p == nullptr
do_something(p);
}
note
For people from Linux kernels, TI_ERROR
is just panic
.
你可以通过使用 TI_ASSERT
来简化上述代码:
int func(void *p) {
TI_ASSERT_INFO(p != nullptr, "The pointer cannot be null!");
// or
// TI_ASSERT(p != nullptr);
// will not reach here if p == nullptr
do_something(p);
}
使用 gdb
调试 Taichi 程序
- 准备一个可以复现问题的脚本,例如
python repro.py
。 - 使用
DEBUG=1 python setup.py develop
(或install
)来编译 Taichi 并提供调试信息。 - 运行
gdb --args python repro.py
, 现在你可以从这里开始调试了! 例如,你可以使用b foo.cpp:102
或b program::compile()
设置断点。
不过,这个解决方案不适用于不能一直复现的问题。 在这种情况下,建议按照下面的章节进行操作,以便在程序崩溃时自动触发 gbd。
程序崩溃时触发 gdb
(仅限于 Linux 操作系统)
# Python
ti.init(gdb_trigger=True)
// C++
CoreState::set_trigger_gdb_when_crash(true);
# Shell
export TI_GDB_TRIGGER=1
note
Quickly pinpointing segmentation faults/assertion failures using gdb
: When Taichi crashes, gdb
will be triggered and attach to the current thread. 您可能需要输入和 sudo
超级用户权限密码以允许将 gdb 附属于当前线程。 在输入 gdb
之后,你可以使用 bt
(backtrace
)命令检查堆的回溯,从而定位到产生错误的代码的具体行号。