<?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: Manuele Conti</title>
    <description>The latest articles on DEV Community by Manuele Conti (@manux81).</description>
    <link>https://dev.to/manux81</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1504766%2F9a4a1dc2-fc8a-426f-b770-16d81cea1675.jpeg</url>
      <title>DEV Community: Manuele Conti</title>
      <link>https://dev.to/manux81</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/manux81"/>
    <language>en</language>
    <item>
      <title>I stopped trusting step-by-step debugging for complex state</title>
      <dc:creator>Manuele Conti</dc:creator>
      <pubDate>Fri, 06 Feb 2026 21:58:02 +0000</pubDate>
      <link>https://dev.to/manux81/visualizing-program-state-instead-of-just-stepping-through-code-4mib</link>
      <guid>https://dev.to/manux81/visualizing-program-state-instead-of-just-stepping-through-code-4mib</guid>
      <description>&lt;p&gt;If you’ve ever stepped through code for minutes only to realize&lt;br&gt;&lt;br&gt;
you &lt;em&gt;still&lt;/em&gt; don’t understand what your program looks like in memory,&lt;br&gt;&lt;br&gt;
you already know the problem.&lt;/p&gt;

&lt;p&gt;Most debuggers are great at answering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What line of code am I on?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But many real-world bugs don’t live in control flow.&lt;br&gt;&lt;br&gt;
They live in &lt;strong&gt;state&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When step-by-step debugging breaks down
&lt;/h2&gt;

&lt;p&gt;Traditional debuggers start to struggle when you deal with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deeply nested data structures
&lt;/li&gt;
&lt;li&gt;pointer-heavy models
&lt;/li&gt;
&lt;li&gt;complex object graphs
&lt;/li&gt;
&lt;li&gt;non-trivial runtime relationships between variables
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these cases, stepping line by line gives you &lt;em&gt;movement&lt;/em&gt;,&lt;br&gt;&lt;br&gt;
but very little &lt;em&gt;understanding&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The code executes correctly —&lt;br&gt;&lt;br&gt;
the &lt;strong&gt;data shape doesn’t&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s the gap qddd tries to explore.&lt;/p&gt;




&lt;h2&gt;
  
  
  qddd: visualizing program state, not just execution
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;qddd&lt;/strong&gt; is an experimental Qt-based graphical debugger frontend&lt;br&gt;&lt;br&gt;
focused on understanding &lt;strong&gt;runtime program state&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of treating variables as flat text trees,&lt;br&gt;&lt;br&gt;
qddd aims to represent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;object relationships
&lt;/li&gt;
&lt;li&gt;pointer connections
&lt;/li&gt;
&lt;li&gt;nested structures as actual structures
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make complex runtime state easier to reason about.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Under the hood, qddd communicates with &lt;strong&gt;GDB via the Machine Interface (MI)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
and keeps a strict separation between the debugger backend and the UI layer.&lt;/p&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Experimental project&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
APIs, internal models, and UI are still evolving.&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshot
&lt;/h2&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%2Fplkwsibq4rejyd4z097g.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%2Fplkwsibq4rejyd4z097g.png" alt="qddd main window" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UI and layout are still evolving as the project develops.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding the graphical state view
&lt;/h2&gt;

&lt;p&gt;One of the core ideas behind qddd is treating runtime state as a &lt;strong&gt;spatial structure&lt;/strong&gt;, not just a textual list.&lt;/p&gt;

&lt;p&gt;The graphical variables view is built around a few key concepts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variables as nodes
&lt;/h3&gt;

&lt;p&gt;Each top-level variable is rendered as a &lt;strong&gt;node&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the header shows the variable name and, when available, its memory address
&lt;/li&gt;
&lt;li&gt;the body shows its internal structure
&lt;/li&gt;
&lt;li&gt;complex variables can be expanded and collapsed incrementally
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This mirrors how data actually exists in memory:&lt;br&gt;&lt;br&gt;
objects containing other objects, not flat name/value pairs.&lt;/p&gt;

&lt;p&gt;Each node is an independent visual unit that can be moved, inspected, and compared spatially.&lt;/p&gt;




&lt;h3&gt;
  
  
  Hierarchical state with controlled expansion
&lt;/h3&gt;

&lt;p&gt;Inside each node, variables are displayed as structured rows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nested variables are indented, not flattened
&lt;/li&gt;
&lt;li&gt;expansion is explicit and local
&lt;/li&gt;
&lt;li&gt;pagination is used to avoid vertical explosions for large structures
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is intentional.&lt;/p&gt;

&lt;p&gt;The goal is to &lt;strong&gt;preserve shape&lt;/strong&gt;, not to show everything at once.&lt;br&gt;&lt;br&gt;
You expand state only where it matters, keeping the mental model stable.&lt;/p&gt;




&lt;h3&gt;
  
  
  Pointer relationships as edges
&lt;/h3&gt;

&lt;p&gt;When a variable represents a pointer and its target can be resolved, qddd draws an &lt;strong&gt;edge&lt;/strong&gt; between nodes.&lt;/p&gt;

&lt;p&gt;This turns invisible relationships like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;object references
&lt;/li&gt;
&lt;li&gt;linked structures
&lt;/li&gt;
&lt;li&gt;shared or aliased data
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;into &lt;strong&gt;explicit visual connections&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of mentally resolving addresses and dereferencing values, you can &lt;em&gt;see&lt;/em&gt; how objects relate to each other.&lt;/p&gt;

&lt;p&gt;This becomes especially useful when debugging graphs, trees with back-references, or complex ownership models.&lt;/p&gt;




&lt;h3&gt;
  
  
  State over execution
&lt;/h3&gt;

&lt;p&gt;This view is intentionally &lt;strong&gt;not step-centric&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You don’t watch values change line by line.&lt;br&gt;&lt;br&gt;
You stop execution and ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What does my program look like right now?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The canvas, zooming, panning, and free layout support this kind of inspection.&lt;br&gt;&lt;br&gt;
You navigate &lt;strong&gt;state space&lt;/strong&gt;, not instruction flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why focus on state-first debugging?
&lt;/h2&gt;

&lt;p&gt;Most debuggers optimize for execution flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;breakpoints
&lt;/li&gt;
&lt;li&gt;stepping
&lt;/li&gt;
&lt;li&gt;stack navigation
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But many bugs come from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;invalid object relationships
&lt;/li&gt;
&lt;li&gt;corrupted graphs
&lt;/li&gt;
&lt;li&gt;broken invariants inside complex structures
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;qddd flips the usual question.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How did execution get here?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What exists in memory at this moment?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Execution control becomes secondary to &lt;strong&gt;state comprehension&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What qddd is &lt;em&gt;not&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;To set expectations clearly, qddd does &lt;strong&gt;not&lt;/strong&gt; aim to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;replace a full IDE debugger
&lt;/li&gt;
&lt;li&gt;compete on feature parity with IDEs
&lt;/li&gt;
&lt;li&gt;optimize for beginners
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;qddd targets developers dealing with&lt;br&gt;&lt;br&gt;
&lt;strong&gt;complex in-memory state&lt;/strong&gt; where textual inspection is insufficient.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project status
&lt;/h2&gt;

&lt;p&gt;qddd is a work in progress:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;features are incomplete
&lt;/li&gt;
&lt;li&gt;internal models are evolving
&lt;/li&gt;
&lt;li&gt;UI is experimental
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this stage, &lt;strong&gt;conceptual feedback and discussion&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
are more valuable than bug reports.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source code
&lt;/h2&gt;

&lt;p&gt;The project is open source on GitHub:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/manux81/qddd" rel="noopener noreferrer"&gt;https://github.com/manux81/qddd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback, ideas, and prior-art pointers are very welcome.&lt;/p&gt;

&lt;p&gt;If you’ve struggled with understanding complex runtime state,&lt;br&gt;&lt;br&gt;
I’d love to hear how you approach it.&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>gdb</category>
      <category>programming</category>
      <category>tooling</category>
    </item>
    <item>
      <title>ncmqtt - Netcat over MQTT</title>
      <dc:creator>Manuele Conti</dc:creator>
      <pubDate>Sun, 19 May 2024 14:02:59 +0000</pubDate>
      <link>https://dev.to/manux81/ncmqtt-netcat-over-mqtt-48lj</link>
      <guid>https://dev.to/manux81/ncmqtt-netcat-over-mqtt-48lj</guid>
      <description>&lt;p&gt;&lt;strong&gt;What is ncmqtt?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ncmqtt is an innovative tool for Linux and MacOS that brings the functionalities of netcat into the realm of the MQTT (Message Queuing Telemetry Transport) protocol. MQTT is a lightweight messaging protocol designed for connections with remote locations where a small code footprint is required or the network bandwidth is limited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simplicity: The tool is designed to be straightforward, making it easy to use for both beginners and experienced users.&lt;/li&gt;
&lt;li&gt;Versatility: Whether you need to troubleshoot, test, or set up simple MQTT-based communications, ncmqtt has you covered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Getting Started&lt;/strong&gt;&lt;br&gt;
Build&lt;/p&gt;

&lt;p&gt;To build the ncmqtt project, follow these steps:&lt;/p&gt;

&lt;p&gt;Clone the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone git@github.com:manux81/ncmqtt.git
cd ncmqtt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the Path to Paho MQTT Library:&lt;/p&gt;

&lt;p&gt;You can set the path to the Paho MQTT library using the PAHO_MQTT_DIR variable when configuring the project with CMake.&lt;br&gt;
If PAHO_MQTT_DIR is not set, CMake will attempt to find the Paho MQTT library using the find_package command.&lt;br&gt;
Build the Project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir build
cd build
cmake -DPAHO_MQTT_DIR=/path/to/paho.mqtt.c ..
make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usage&lt;/p&gt;

&lt;p&gt;The ncmqtt command supports various options to configure its behavior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Usage: ncmqtt [&amp;lt;options&amp;gt;]
 -h : show this help message
 -v : show version
 -T : topic for sharing messages: default = nc_channel_pub
 -l : enable listening to incoming messages
 -S : set server host : default = test.mosquitto.org
 -P : set server port : default = 1883
 -A : set server auth = user,pwd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Send a file&lt;/strong&gt;&lt;br&gt;
Client A:&lt;br&gt;
&lt;code&gt;./ncmqtt -l &amp;gt; output&lt;/code&gt;&lt;br&gt;
Client B:&lt;br&gt;
&lt;code&gt;./ncmqtt &amp;lt; file&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That's it!&lt;/p&gt;

</description>
      <category>cli</category>
      <category>bash</category>
      <category>mqtt</category>
    </item>
  </channel>
</rss>
