wasm-tracing-allocator

A global allocator for Wasm that traces allocations and deallocations for debugging purposes.

Build Status

wasm-tracing-allocator enables you to better debug and analyze memory leaks and invalid frees in an environment where we don't have access to the conventional tools like Valgrind. The tracing hooks are safely implemented in JS, outside the Wasm module and its linear memory, to ensure that the tracing code doesn't perturb results.

Table of Contents

Enabling the Tracing Allocator

First, add wasm-tracing-allocator to your Cargo.toml's dependency list:

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

Next, configure wasm_tracing_allocator::WasmTracingAllocator as the global allocator:

```rust // src/lib.rs

use std::alloc::System; use wasmtracingallocator::WasmTracingAllocator;

[global_allocator]

static GLOBAL_ALLOCATOR: WasmTracingAllocator = WasmTracingAllocator(System); ```

Finally, make the JS implementations of the tracing hooks are available for your Wasm module to import:

Analyzing and Debugging

Use your developer tools console to invoke methods of the global WasmTracingAllocator object to get analyses about allocations and deallocations.

The output is typically rendered with console.table:

Example output

WasmTracingAllocator.dumpLiveAllocations

Dump a table of live allocations to the console.

js WasmTracingAllocator.dumpLiveAllocations({ keyLabel: String, valueLabel: String, getKey: Object => any, getValue: Object => Number, });

WasmTracingAllocator.dumpInvalidFrees

Dump a table of invalid frees (double frees, frees of things that were never allocated, etc...) to the console.

js WasmTracingAllocator.dumpInvalidFrees({ keyLabel: String, valueLabel: String, getKey: Object => any, getValue: Object => Number, });