调试Rust Polars程序时,如何查看DataFrame/Series中的值?
调试Rust Polars时无法查看DataFrame/Series内容的临时解决方案
问题背景
在Ubuntu Server 24.04上使用VSCode + rust-analyzer + codelldb调试Rust代码时,无法像调试Python Pandas那样便捷查看Polars的DataFrame或Series内容:
- VSCode变量窗口仅显示结构体的内存地址或空壳信息,无具体数据
- 调试控制台输入
dbg!会提示'dbg' is not a valid command错误(dbg!是Rust宏,需写在代码中而非调试控制台) - 向Polars项目反馈后得知,这是LLDB长期存在的Rust结构体格式化问题,官方
rust-lldb脚本也未解决,RustRover同样无此功能
测试代码如下:
use polars::prelude::*; use rand::Rng; fn main() -> Result<(), PolarsError> { // 生成长度为15的示例数据 let mut rng = rand::thread_rng(); let amount: Vec<i32> = (0..15).map(|_| rng.gen_range(100..600)).collect(); let cond: Vec<bool> = (0..15).map(|_| rng.gen_bool(0.3)).collect(); let amount_series = Series::new("amount", amount); let cond_series = Series::new("cond", cond); let df = DataFrame::new(vec![ amount_series, cond_series, ])?; // 此处println!能打印df,但断点时变量窗口看不到数据 println!("{}", df); Ok(()) }
临时解决方案
1. 代码中嵌入打印宏
这是最直接的方式,在断点前插入dbg!或println!宏,运行调试时会在终端输出完整数据:
// 在断点行前添加 dbg!(&df); // 打印df的详细结构和数据 // 或者针对单个Series dbg!(&amount_series);
注意:dbg!是Rust标准库宏,必须写在代码中重新编译,不能在调试控制台直接调用。
2. 自定义LLDB格式化脚本
通过编写LLDB Python脚本,为Polars的DataFrame和Series定制格式化规则,让VSCode变量窗口显示可读内容:
- 在项目根目录创建
lldb_polars.py脚本:
import lldb def format_polars_series(valobj, internal_dict): try: name = valobj.GetChildMemberWithName("name").GetSummary() values = valobj.GetChildMemberWithName("values") return f"Polars Series: {name}\nValues: {values.GetSummary()}" except Exception as e: return f"[Polars Series: 格式化失败 {e}]" def format_polars_dataframe(valobj, internal_dict): try: columns = valobj.GetChildMemberWithName("columns") shape = valobj.GetChildMemberWithName("shape") return f"Polars DataFrame: {shape.GetSummary()}\nColumns: {columns.GetSummary()}" except Exception as e: return f"[Polars DataFrame: 格式化失败 {e}]" def __lldb_init_module(debugger, internal_dict): debugger.HandleCommand('type summary add -F lldb_polars.format_polars_series polars::prelude::Series') debugger.HandleCommand('type summary add -F lldb_polars.format_polars_dataframe polars::prelude::DataFrame')
- 修改VSCode的
launch.json,添加初始化命令加载脚本:
{ "version": "0.2.0", "configurations": [ { "type": "lldb", "request": "launch", "name": "Debug Rust", "program": "${workspaceFolder}/target/debug/${workspaceFolderBasename}", "args": [], "cwd": "${workspaceFolder}", "preLaunchTask": "cargo build", "initCommands": [ "command script import ${workspaceFolder}/lldb_polars.py" ] } ] }
重启调试后,变量窗口的DataFrame和Series会显示自定义的可读摘要,若需要更详细数据,可展开结构体查看深层字段。
3. 手动查看结构体深层字段
如果不想写脚本,可以通过VSCode变量窗口手动展开Polars结构体的内部字段:
- DataFrame可查看
columns字段下的每个Series,再展开Series的values字段查看具体数据 - 该方式繁琐,但能直接获取原始数据
现状说明
目前LLDB对Rust复杂泛型结构体的格式化支持仍不完善,暂无开箱即用的完美解决方案。上述方法均为临时替代方案,需等待LLDB或Rust工具链的后续改进。
内容的提问来源于stack exchange,提问作者Swamp Rager
相关产品推荐
相关产品推荐

