跳转至主要内容
Version: develop

开发者工具

本节详细描述了 Taichi 开发者常用的工具。

日志

Taichi 使用 spdlog 作为其日志系统。 日志可以有从低到高的不同等级,分别是:

等级
trace
debug
info
warn
error

日志等级越高,日志信息就越严重。

默认日志等级是 info。 你可以通过下面的方式覆盖默认的日志级别:

  1. 设置环境变量,例如 export TI_LOG_LEVEL=warn
  2. 在 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 程序

  1. 准备一个可以复现问题的脚本,例如 python repro.py
  2. 使用 DEBUG=1 python setup.py develop (或 install)来编译 Taichi 并提供调试信息。
  3. 运行 gdb --args python repro.py, 现在你可以从这里开始调试了! 例如,你可以使用 b foo.cpp:102b 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 之后,你可以使用 btbacktrace)命令检查堆的回溯,从而定位到产生错误的代码的具体行号。