Skip to content

viztracer 在 ROS 开发中的使用

VizTracer 是一种低开销的日志记录/调试/分析工具,可以跟踪和可视化您的 python 代码执行。

前端 UIPerfetto 提供支持。使用AWSD缩放/导航。

感谢 VizTracer 的作者大佬高天开发的 python 调试、分析利器VizTracer

特点

  • 在时间轴上详细记录了函数进入/退出信息以及完整源代码
  • 超级易于使用,大多数功能无需更改源代码,无包依赖性
  • 性能开销低,可能是市场上最快的跟踪器
  • 支持线程、多处理、子进程、异步和 PyTorch 的调试
  • 使用了强大的前端框架,能够流畅渲染 GB 量级的跟踪数据
  • 良好的跨平台特性,适用于 Linux/MacOS/Windows

基本环境安装

  • pip 安装 VizTracer
bash
pip install viztracer
pip install viztracer

VSCode 安装及配置

  • 安装 VizTracer

vscode 插件市场搜索 VizTracer 安装即可

  • 配置 VizTracer 扩展

这样,就可以在运行时,自动生成 VizTracer 的追踪文件,并自动打开浏览器进行查看

在命令行中运行 VizTracer

在命令行中运行 VizTracer,并指定要跟踪的 python 文件

无需传参运行 VizTracer

生成 VizTracer 的可视化文件result.json

bash
python3 -m viztracer my_script.py
python3 -m viztracer my_script.py

在浏览器中打开 VizTracer 的可视化文件

bash
vizviewer result.json
vizviewer result.json

技巧

可以在使用时添加--open参数,这样就可以在运行时自动打开浏览器进行查看,完整命令如下:

bash
python3 -m viztracer --open my_script.py
python3 -m viztracer --open my_script.py

传参运行 VizTracer

bash
python3 -m viztracer my_script.py arg1 arg2
python3 -m viztracer my_script.py arg1 arg2

VSCode 中运行 VizTracer

VizTracer 追踪 ROS 程序

可以详细看到,程序在运行时的调用栈,以及函数的执行时间等关键细节信息

完整的时间线追踪

create_subscription 函数调用栈

可以看到订阅者创建的调用栈持续了 30 ms

spin_once 函数调用栈

spin_once 函数调用栈单次持续了 124ms 秒,与订阅者创建的调用栈相比,两者相差约 4 倍。

有了这些信息,我们就可以非常容易得可视化的找到性能瓶颈位置,并针对程序进行优化。

限制

  • VizTracer 使用 sys.setprofile() (Python3.12 之前)和 sys.monitoring(Python3.12 之后)作为其分析器功能,因此它会与也使用这些机制的其他分析工具发生冲突。使用 VizTracer 时要注意这一点

  • WSL1 上的时钟分辨率和延迟非常糟糕,因此如果您使用 WSL1,您可能会遇到额外的开销。除了升级到 WSL2 之外,没有其他解决方案。

  • VizTracer 与其他需要在模块内执行任意代码的 Python 工具一样,可能会与检查顶层模块或具有其他结构要求的代码发生冲突。例如,如果您从命令行使用 VizTracer,unittest.main() 将不起作用。有一些方法可以避免它。您可以使用内联 VizTracer,它始终有效。或者您可以将模块指定为 unittest.main() ,这不是通用解决方案,但无需进行太多代码更改即可工作。

参考