<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: SickleFire</title>
    <description>The latest articles on DEV Community by SickleFire (@sicklefire).</description>
    <link>https://dev.to/sicklefire</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3910334%2F16843084-465f-499e-b80c-9a48bee8bc93.jpeg</url>
      <title>DEV Community: SickleFire</title>
      <link>https://dev.to/sicklefire</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sicklefire"/>
    <language>en</language>
    <item>
      <title>M-vis v0.5.0-rc1 update</title>
      <dc:creator>SickleFire</dc:creator>
      <pubDate>Tue, 07 Jul 2026 12:11:10 +0000</pubDate>
      <link>https://dev.to/sicklefire/m-vis-v050-rc1-update-11cp</link>
      <guid>https://dev.to/sicklefire/m-vis-v050-rc1-update-11cp</guid>
      <description>&lt;p&gt;[0.5.0-rc1] - 2026-07-6&lt;br&gt;
&lt;strong&gt;Added&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD Mode: Full programmatic integration layer with JSON/CSV export, differential leak detection (--diff-only), configurable sampling, and growth rate monitoring.&lt;/li&gt;
&lt;li&gt;Enhanced TUI: keyboard-driven process selection, quick action buttons.&lt;/li&gt;
&lt;li&gt;Improved Leak Detection: Better Linux heap walk via /proc/maps, optimized memory diff algorithms for large heaps.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Catching Memory Leaks in CI with &lt;code&gt;mvis&lt;/code&gt; v0.5.0-rc1
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;mvis&lt;/code&gt; now ships as a reusable GitHub Action, so you can drop heap monitoring and leak detection straight into your existing workflow — no manual binary download, no custom scripts. This post walks through setting it up using the &lt;code&gt;v0.5.0-rc1&lt;/code&gt; pre-release.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the action does
&lt;/h2&gt;

&lt;p&gt;Under the hood, the action:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Downloads the right &lt;code&gt;mvis&lt;/code&gt; binary for the runner's OS and architecture (Linux, Windows, or macOS — Intel or Apple Silicon).&lt;/li&gt;
&lt;li&gt;Builds a &lt;code&gt;mvis ci&lt;/code&gt; command from your inputs.&lt;/li&gt;
&lt;li&gt;Runs it against a PID, a fuzzy process name, or a command you want it to spawn and watch.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Basic usage
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run mvis memory audit&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SickleFire/m-vis@v0.5.0-rc1&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v0.5.0-rc1&lt;/span&gt;
    &lt;span class="na"&gt;spawn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./target/release/my_app&lt;/span&gt;
    &lt;span class="na"&gt;max-memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;512&lt;/span&gt;
    &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This spawns &lt;code&gt;my_app&lt;/code&gt;, watches it for 60 seconds, and fails the step if it ever exceeds 512 MB RSS.&lt;/p&gt;

&lt;p&gt;On Windows, &lt;code&gt;max-memory&lt;/code&gt; currently depends on the underlying heap-walk succeeding. If the walk itself errors out for some reason, &lt;code&gt;mvis&lt;/code&gt; can still complete the step rather than failing loud — worth keeping in mind if a step passes suspiciously easily.&lt;/p&gt;
&lt;h2&gt;
  
  
  Choosing a target
&lt;/h2&gt;

&lt;p&gt;You need exactly one of these three inputs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spawn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You want &lt;code&gt;mvis&lt;/code&gt; to launch and own the process. &lt;strong&gt;Must be the last thing you configure&lt;/strong&gt; — anything after it in the composite action's internal command line gets treated as arguments to your spawned command, not to &lt;code&gt;mvis&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You already have a running process (e.g. started in an earlier step) and just want to attach.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;process-name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fuzzy-match against running processes by name — handy when the PID isn't known ahead of time.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;spawn&lt;/code&gt; currently needs a path with a separator in it — &lt;code&gt;./my_app&lt;/code&gt;, &lt;code&gt;build/my_app.exe&lt;/code&gt; — even when the binary sits right in the working directory. A bare filename like &lt;code&gt;spawn: my_app.exe&lt;/code&gt; fails with &lt;code&gt;program not found&lt;/code&gt;, because the path-resolution logic doesn't fall back to checking the current directory the way a shell normally would. Always prefix with &lt;code&gt;./&lt;/code&gt; (or the equivalent relative path) to be safe.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Attach to an already-running process by PID&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Start server&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./server &amp;amp; echo "pid=$!" &amp;gt;&amp;gt; "$GITHUB_OUTPUT"&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;server&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Monitor it&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SickleFire/m-vis@v0.5.0-rc1&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v0.5.0-rc1&lt;/span&gt;
    &lt;span class="na"&gt;pid&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.server.outputs.pid }}&lt;/span&gt;
    &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;120&lt;/span&gt;
    &lt;span class="na"&gt;max-memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1024&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Monitoring flags
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;max-memory&lt;/code&gt;&lt;/strong&gt; — fail the step if RSS crosses this many MB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;leak-check&lt;/code&gt;&lt;/strong&gt; — compares a baseline snapshot against the end state and fails if net-retained memory looks like a leak rather than expected steady-state growth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;duration&lt;/code&gt;&lt;/strong&gt; — how long to watch before mvis exits (in seconds). If omitted, mvis watches until the target process exits on its own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can combine &lt;code&gt;max-memory&lt;/code&gt; and &lt;code&gt;leak-check&lt;/code&gt; in the same run — &lt;code&gt;mvis&lt;/code&gt; will fail the step on whichever condition trips first.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on macOS
&lt;/h2&gt;

&lt;p&gt;The macOS binaries are ad-hoc signed with an entitlements file so &lt;code&gt;mvis&lt;/code&gt; can inspect another process's memory. This is still being hardened for CI use — if you're running the smoke-test / action-triggered flow on &lt;code&gt;macos-latest&lt;/code&gt; and see it hang rather than pass or fail cleanly, that's a known area under active investigation rather than a config mistake on your end. Linux and Windows runners aren't affected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full example: fail PRs on memory regressions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Memory check&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;memory-check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build app&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cargo build --release&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run mvis memory audit&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SickleFire/m-vis@v0.5.0-rc1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v0.5.0-rc1&lt;/span&gt;
          &lt;span class="na"&gt;spawn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./target/release/my_app&lt;/span&gt;
          &lt;span class="na"&gt;max-memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;256&lt;/span&gt;
          &lt;span class="na"&gt;leak-check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;45&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it — one job, no custom scripting, catching memory regressions before they merge.&lt;/p&gt;




&lt;p&gt;Author:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SickleFire&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See &lt;a href="https://github.com/SickleFire/m-vis" rel="noopener noreferrer"&gt;M-vis&lt;/a&gt;, leave a star, a bug report and PR is always welcomed!&lt;/p&gt;

</description>
      <category>rust</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Designing a cross-platform terminal memory visualizer in Rust</title>
      <dc:creator>SickleFire</dc:creator>
      <pubDate>Sun, 28 Jun 2026 08:14:27 +0000</pubDate>
      <link>https://dev.to/sicklefire/designing-a-cross-platform-terminal-memory-visualizer-in-rust-2365</link>
      <guid>https://dev.to/sicklefire/designing-a-cross-platform-terminal-memory-visualizer-in-rust-2365</guid>
      <description>&lt;h1&gt;
  
  
  The Why
&lt;/h1&gt;

&lt;p&gt;Before diving into the design of m-vis, let's first get into why. The spark for this project came while I was building a 3D interactive model viewer in C++ using OpenGL. As the complexity of the renderer grew, so did a notoriously frustrating problem: memory leaks. Tracking down stray allocations in a real-time, graphics-heavy application quickly turned into a tedious game of whack-a-mole. &lt;/p&gt;

&lt;p&gt;I realized I didn't just want to fix my code; I wanted to fundamentally solve the problem of how we detect, track, and understand memory leaks in the first place. That frustration is what drove me to build a tool that makes memory management visual, intuitive, and painless.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Vision
&lt;/h1&gt;

&lt;p&gt;I envisioned this project to prioritize user experience and simplicity above all else. Not only that it must be cross-platform; Because of this Rust is the perfect choice, because of its compiler make cross-compilation remarkably smooth.&lt;/p&gt;

&lt;p&gt;A memory visualizer is useless if it slows down the target application so much that it alters its runtime behavior or masks the very bugs you are trying to find. In graphics-heavy or real-time applications like a 3D model viewer, keeping execution overhead to an absolute minimum is mandatory. Because of that requirement, non-invasive memory scanning techniques are used.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Architecture
&lt;/h1&gt;

&lt;p&gt;M-vis has 3 distinct stages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory Provider (OS Layer)&lt;/li&gt;
&lt;li&gt;Core Engine&lt;/li&gt;
&lt;li&gt;UI (CLI, TUI)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Memory Provider is the most interesting stage because this stage gathers heap and region metadata that the Core uses. However, one of our requirements is it must be a cross-platform. So how does the Memory Provider know which Operating System you are running on without adding a bunch of messy runtime checks?&lt;/p&gt;

&lt;p&gt;The answer is Rust's conditional compilation. We can tell the compiler which code to run, based on your toolchain.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Memory Provider Trait
&lt;/h3&gt;

&lt;p&gt;To bridge the gap between platform-specific chaos and a clean, unified architecture, we need a strict contract. In Rust, that means defining a trait.&lt;/p&gt;

&lt;p&gt;The Core Engine shouldn't care whether it is talking to Linux's /proc filesystem or the Windows Win32 API; it just needs data. By defining a single interface, every operating system module must implement the exact same behaviors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="cd"&gt;/// Abstraction over OS-specific memory inspection APIs.&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="n"&gt;MemoryProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cd"&gt;/// Returns all virtual memory regions mapped into the process with the given `pid`.&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;walk_regions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Region&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="cd"&gt;/// Returns all heap blocks (both used and free) for the process with the given `pid`.&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;walk_heap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;HeapBlock&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="cd"&gt;/// Returns loaded modules for the process with the given `pid`.&lt;/span&gt;
    &lt;span class="cd"&gt;///&lt;/span&gt;
    &lt;span class="cd"&gt;/// Pass `"-t"` as `flag` to restrict the output to tampered or injected modules only.&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;list_modules&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ModuleInfo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the Memory Provider trait that every operating system backend must implement. Its core job is translation. It maps messy, platform-specific memory data into clean, platform-agnostic data structures—specifically HeapBlock and Region—that our core engine can easily understand.&lt;/p&gt;

&lt;p&gt;Region Struct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Region&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RegionState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RegionKind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;protect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RegionProtect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Heap Block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;HeapBlock&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;is_free&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;vm_protect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RegionProtect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Core
&lt;/h3&gt;

&lt;p&gt;The Core is the central engine of m-vis, responsible for two primary tasks: process scanning and data differentiation. It takes the platform-agnostic blocks provided by the OS layer and processes them to identify trends and track allocations.&lt;/p&gt;

&lt;p&gt;We won't dive deep into the Core's internals in this post, as our primary goal is to look at the cross-platform engineering behind gathering the data itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  The UI (CLI &amp;amp; TUI)
&lt;/h3&gt;

&lt;p&gt;The final stage of the architecture is the presentation layer. Once the Core Engine has processed the raw memory data into identifiable trends, it hands that data package off to the user interface.&lt;/p&gt;

&lt;p&gt;To keep the project lightweight and accessible, the UI layer is split into two modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;CLI Mode: A traditional command-line interface designed for quick, scriptable, or text-only memory snapshots. It is perfect if you want a fast terminal output without any visual overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TUI Mode: This is where m-vis comes to life. Written natively in Rust using Ratatui, the Terminal User Interface transforms the raw allocation into interactive blocks, Leak delta chart, and Allocation tables.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;By designing a clean Memory Provider trait and leaning on Rust's compile-time conditional compilation, the tool stays completely cross-platform without adding any runtime bloat.&lt;/p&gt;

&lt;p&gt;Building m-vis started because I was exhausted of encountering memory leaks in OpenGL/C++. My personal frustration turned into a passion project that will not only help me but will also make finding memory leaks effortless for other people.&lt;/p&gt;




&lt;p&gt;Check out m-vis: &lt;a href="https://github.com/SickleFire/m-vis" rel="noopener noreferrer"&gt;https://github.com/SickleFire/m-vis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Authors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SickleFire - Owner&lt;/li&gt;
&lt;li&gt;Djo - Community Manager&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Visualizing the Slope: Introducing the m-vis Real-Time Leak Delta Chart</title>
      <dc:creator>SickleFire</dc:creator>
      <pubDate>Tue, 09 Jun 2026 11:14:35 +0000</pubDate>
      <link>https://dev.to/sicklefire/visualizing-the-slope-introducing-the-m-vis-real-time-leak-delta-chart-1g3d</link>
      <guid>https://dev.to/sicklefire/visualizing-the-slope-introducing-the-m-vis-real-time-leak-delta-chart-1g3d</guid>
      <description>&lt;p&gt;Debugging memory leaks by watching a wall of flashing text numbers is a guessing game. You can see the numbers moving, but you entirely miss the trends, spikes, and rhythm of your application.&lt;/p&gt;

&lt;p&gt;To solve this, &lt;strong&gt;m-vis&lt;/strong&gt; has introduced: the &lt;strong&gt;Real-Time Leak Delta Chart&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;By translating raw allocation differentials into a live, scrolling historical timeline right inside your terminal, &lt;code&gt;m-vis&lt;/code&gt; shifts memory debugging from a game of parsing numbers to simple, immediate pattern recognition.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is the Leak Delta Chart?
&lt;/h2&gt;

&lt;p&gt;The Leak Delta Chart is a dedicated visual component in the TUI that maps the output of the core &lt;code&gt;LeakDelta&lt;/code&gt; engine over time. Instead of showing you the total size of your application's memory, it charts the &lt;strong&gt;net balance&lt;/strong&gt; of every single cycle (Allocated Bytes minus Freed Bytes).&lt;/p&gt;

&lt;p&gt;The chart centers around a &lt;strong&gt;Zero Baseline Axis&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Above the Axis (Positive):&lt;/strong&gt; Represents net memory accumulation (the app claimed bytes it didn’t return).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Below the Axis (Negative):&lt;/strong&gt; Represents net memory reclamation (the app actively cleaned up more than it took).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What it looks like in your terminal:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7jzeshvmvjy2gnh3hfy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7jzeshvmvjy2gnh3hfy.png" alt="Leak Delta Chart" width="799" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This graph illustrates an application experiencing a persistent memory leak. The steady upward trend above the baseline indicates that memory is continuously being allocated but not properly released.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it Out
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;m-vis&lt;/code&gt; is built to be simple to use, lightweight, and completely cross-platform. &lt;/p&gt;

&lt;p&gt;If you want to move past parsing raw text numbers and actually &lt;em&gt;see&lt;/em&gt; your memory behavior, check out the project on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/SickleFire/m-vis" rel="noopener noreferrer"&gt;Check out m-vis on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me know what you think in the comments, or what features you'd love to see added to the TUI next!&lt;/p&gt;

</description>
      <category>rust</category>
      <category>performance</category>
      <category>cli</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Mvis: Memory Debugging Made Simple and Accessible</title>
      <dc:creator>SickleFire</dc:creator>
      <pubDate>Sun, 03 May 2026 16:25:43 +0000</pubDate>
      <link>https://dev.to/sicklefire/mvis-memory-debugging-made-simple-and-accessible-18j7</link>
      <guid>https://dev.to/sicklefire/mvis-memory-debugging-made-simple-and-accessible-18j7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Debugging memory leaks has always been one of those tasks developers dread.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tools like Valgrind or WinDbg are powerful, but they’re either platform‑specific or too complex for quick diagnostics. I wanted something different: a tool that gives developers answers fast. &lt;/p&gt;

&lt;p&gt;That’s the philosophy behind Mvis — a Rust‑based memory visualizer and leak detector.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Mvis
&lt;/h1&gt;

&lt;p&gt;Mvis is built around three guiding principles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simplicity:&lt;/strong&gt; One command should be enough to get useful insights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accessibility:&lt;/strong&gt; Debugging shouldn’t be locked behind steep learning curves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross‑platform:&lt;/strong&gt; Whether you’re on Windows or Linux, the workflow should feel the same.&lt;/p&gt;

&lt;p&gt;Or as I like to put it:&lt;br&gt;
&lt;strong&gt;&lt;em&gt;“One command. All platforms. No configuration hell.”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  What it can do
&lt;/h1&gt;

&lt;p&gt;Even in its early stage, Mvis already supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Process scanning: Inspect allocations of active processes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heap‑level analysis: See heap structures in detail. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DLL tracking: Monitor loaded libraries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leak detection: Identify processes with growing, unreleased allocations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stack tracing: Capture call stacks to pinpoint allocation sources.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supported OS: Windows and Linux.&lt;/p&gt;


&lt;h1&gt;
  
  
  Quick Usage Examples
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# visualize memory map&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;mvis&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;scan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;myapp.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-a&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# detect leaks&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;mvis&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;leak&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;leaking_app.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# multi-sample leak detection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;mvis&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;leak-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;myapp.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Outputs are clear and exportable to JSON(Scan), making analysis and visualization easy.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example: Leak Detection
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;mvis&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;leak&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;leaking_app.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flozjotyf9s8x54yoxx4l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flozjotyf9s8x54yoxx4l.png" alt="Output" width="570" height="77"&gt;&lt;/a&gt; &lt;/p&gt;


&lt;h1&gt;
  
  
  Insights
&lt;/h1&gt;

&lt;p&gt;One of the first problems I encountered was:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I make Mvis work on both Windows and Linux?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer turned out to be simple: &lt;strong&gt;platform abstraction.&lt;/strong&gt;&lt;br&gt;
Mvis defines abstractions for memory regions and heap blocks, which means the core logic doesn’t depend on OS‑specific quirks.&lt;/p&gt;

&lt;p&gt;Because of this design, it’s possible to extend support to other platforms in the future — as long as they implement the same abstraction layer Mvis uses.. &lt;/p&gt;


&lt;h1&gt;
  
  
  Roadmap
&lt;/h1&gt;

&lt;p&gt;Mvis is still early but functional. Here’s what’s coming next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;TUI frontend for heap analysis (lightweight by design).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heap fragmentation visualization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Realtime heap scanning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;macOS support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Performance improvements.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Try it out
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/SickleFire" rel="noopener noreferrer"&gt;
        SickleFire
      &lt;/a&gt; / &lt;a href="https://github.com/SickleFire/m-vis" rel="noopener noreferrer"&gt;
        m-vis
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      lightweight cross-platform memory visualizer tool
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;mvis&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;mvis: Memory debugging for developers who just want answers
Simple. Fast. Works everywhere.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why mvis?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Existing tools are either platform-specific (Valgrind, WinDbg) or
too complex for quick diagnostics. mvis gives you memory insights
with a single command on any platform.&lt;/p&gt;
&lt;p&gt;Our design philosophy is built around simplicity and accessibility because &lt;strong&gt;We believe memory debugging should be accessible, not a PhD requirement.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;"One command. All platforms. No configuration hell."&lt;/strong&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Status&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Early but functional. Core scanning and leak detection work on both platforms. See the roadmap below for what's coming.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Process Scanning&lt;/strong&gt;: Inspect memory allocations of active processes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heap-Level Analysis&lt;/strong&gt;: Dive into heap structures for detailed debugging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DLL Tracking&lt;/strong&gt;: Monitor and list all DLLs loaded by a target.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Leak Detection&lt;/strong&gt;: Identify and monitor processes with growing, unreleased allocations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack Tracing&lt;/strong&gt;: Capture call stacks to pinpoint allocation sources and trace execution paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported OS&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/SickleFire/m-vis" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Feedback, contributions, and ideas are welcome. Let’s make memory debugging easier for everyone.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
