You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调试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变量窗口显示可读内容:

  1. 在项目根目录创建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')
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:37:07