开发者工具
本节详细描述了 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)命令检查堆的回溯,从而定位到产生错误的代码的具体行号。