2 个版本

0.1.1 2019 年 5 月 10 日
0.1.0 2019 年 5 月 10 日

#415 in 内存管理

MIT/Apache

56KB
151

wasm-tracing-allocator

一个用于 WebAssembly 的全局分配器,用于跟踪分配和释放以进行调试目的。

Build Status

wasm-tracing-allocator 允许您在没有访问传统工具(如 Valgrind)的环境中更好地调试和分析内存泄漏和无效释放。跟踪钩子安全地在 JS 中实现,在 Wasm 模块及其线性内存之外,以确保跟踪代码不会干扰结果。

目录

启用跟踪分配器

首先,将 wasm-tracing-allocator 添加到您的 Cargo.toml 的依赖项列表中

[dependencies]
wasm-tracing-allocator = "0.1.0"

然后,将 wasm_tracing_allocator::WasmTracingAllocator 配置为全局分配器

// src/lib.rs

use std::alloc::System;
use wasm_tracing_allocator::WasmTracingAllocator;

#[global_allocator]
static GLOBAL_ALLOCATOR: WasmTracingAllocator<System> = WasmTracingAllocator(System);

最后,确保 JS 实现的跟踪钩子对您的 Wasm 模块可导入

  • 在 Web 上,在实例化 Wasm 模块之前添加此脚本

    <script src="https://unpkg.com/[email protected]/js/hooks.js"></script>
    
  • 在 Node.js 上,在实例化 Wasm 模块之前要求钩子

    require("wasm-tracing-allocator");
    

分析和调试

使用您的开发者工具控制台调用全局 WasmTracingAllocator 对象的方法以获取关于分配和释放的分析。

输出通常使用 console.table 渲染

Example output

WasmTracingAllocator.dumpLiveAllocations

将活动分配表输出到控制台。

WasmTracingAllocator.dumpLiveAllocations({
  keyLabel: String,
  valueLabel: String,
  getKey: Object => any,
  getValue: Object => Number,
});
  • keyLabel: 可选。用于描述表中键列的字符串标签。

  • valueLabel: 可选。用于描述表中值列的字符串标签。

  • getKey: 可选。从分配条目对象到任何内容的函数。表将根据键对条目进行分组和聚合。默认为分配时的堆栈。

  • getValue:可选。从分配条目对象到数字的函数。具有相同键的所有条目的值将相加。默认为每个分配的字节数;一个潜在的替代方案是忽略参数并返回 1 来计数分配的数量。

WasmTracingAllocator.dumpInvalidFrees

将无效释放的表(重复释放、从未分配的项目的释放等...)输出到控制台。

WasmTracingAllocator.dumpInvalidFrees({
  keyLabel: String,
  valueLabel: String,
  getKey: Object => any,
  getValue: Object => Number,
});
  • keyLabel: 可选。用于描述表中键列的字符串标签。

  • valueLabel: 可选。用于描述表中值列的字符串标签。

  • getKey:可选。从无效释放条目对象到任何内容的函数。表将根据其键对条目进行分组和汇总。默认为释放时的堆栈。

  • getValue:可选。从无效释放条目对象到数字的函数。具有相同键的所有条目的值将相加。默认为计算无效释放的数量。

依赖项

~0.8–1.4MB
~29K SLoC