Skip to main content

jupyter-cpp-tutor

C++ step-by-step code visualization for JupyterLab 4.x and Notebook 7.

Uses GDB to trace C++ code execution and renders an interactive step-by-step visualization (like Python Tutor / OPT_Mentor) inside a Jupyter notebook cell.

Features

  • %%cpptutor cell magic — write C++ code in a Python kernel cell, get instant visualization
  • GDB-based tracing — compiles with g++ -g, traces with GDB's Python API
  • Step-by-step navigation — slider + first/prev/next/last buttons
  • Variable visualization — int, char, bool, float, pointers, arrays, structs
  • Call stack — see function frames with parameters and locals
  • Pointer arrows — SVG arrows from pointers to their targets
  • Resizable panels — draggable dividers between code/frames/heap columns
  • Iframe srcdoc — works in trusted JupyterLab 4 / Notebook 7 notebooks

Requirements

  • g++ (with -g debug support)
  • gdb (with Python scripting support — standard on Linux)
  • A Python kernel (not a C++ kernel — tracing is done via GDB)
  • JupyterLab 4.x or Notebook 7.x

Installation

pip install jupyter-cpp-tutor

Then load the extension in a notebook:

%load_ext jupyter_cpp_tutor

Or add to your ~/.ipython/profile_default/ipython_config.py:

c.InteractiveShellApp.extensions = ['jupyter_cpp_tutor']

Usage

Basic

%%cpptutor
int main() {
    int x = 1;
    int y = x + 2;
    int z = x * y;
    return 0;
}

Functions

%%cpptutor
int add(int a, int b) {
    return a + b;
}
int main() {
    int x = add(3, 4);
    return 0;
}

Pointers

%%cpptutor
int main() {
    int x = 42;
    int *p = &x;
    return 0;
}

Arrays

%%cpptutor
int main() {
    int arr[3] = {10, 20, 30};
    return 0;
}

Structs

%%cpptutor
struct Point {
    int x;
    int y;
};
int main() {
    Point p;
    p.x = 3;
    p.y = 4;
    return 0;
}

Loops

%%cpptutor
int main() {
    int sum = 0;
    for (int i = 1; i <= 3; i++) {
        sum += i;
    }
    return 0;
}

With cout output

%%cpptutor
#include <iostream>
int main() {
    std::cout << "Hello, C++!" << std::endl;
    int x = 42;
    std::cout << "x = " << x << std::endl;
    return 0;
}

Configuring the compiler

Set the C++ standard and extra compiler flags for the entire notebook:

%cpptutor_config --std c++20 --flags "-Wall -Wextra"

Or per-cell:

%%cpptutor --std c++20
consteval int sq(int n) { return n * n; }
int main() {
    constexpr int x = sq(5);
    return 0;
}

Show current settings or reset:

%cpptutor_config            # show current settings
%cpptutor_config --reset    # back to defaults (c++23, no extra flags)

Default: C++23, no extra flags. -g -O0 are always added for GDB debugging.

Writing code

You must write your own main() function. The magic does not auto-wrap your code — this ensures GDB line numbers map 1:1 to your source for accurate step highlighting.

Common #include headers (<iostream>, <string>, <vector>, <map>, <list>, <set>, <memory>) are added automatically if not already present. A #line 1 directive is injected so GDB reports line numbers matching your original source exactly.

If you forget main(), you'll get a clear error message reminding you.

How It Works

  1. Standard #include headers are prepended (if not already present)
  2. A #line 1 "user.cpp" directive ensures GDB line numbers match your source 1:1
  3. The code is compiled with g++ -g -O0 -std=c++23
  4. GDB runs in batch mode with a Python script that:
    • Sets breakpoints on main() and all user-defined functions
    • Steps through execution with next
    • At each step, captures variables (via GDB's block/symbol API)
    • Captures the call stack and heap objects (from new/malloc pointers)
  5. The trace is rendered as an HTML iframe with srcdoc

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jupyter_cpp_tutor-0.2.2.tar.gz (31.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jupyter_cpp_tutor-0.2.2-py3-none-any.whl (25.8 kB view details)

Uploaded Python 3

File details

Details for the file jupyter_cpp_tutor-0.2.2.tar.gz.

File metadata

  • Download URL: jupyter_cpp_tutor-0.2.2.tar.gz
  • Upload date:
  • Size: 31.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for jupyter_cpp_tutor-0.2.2.tar.gz
Algorithm Hash digest
SHA256 97045f6c62adfaa61fb79d77530f4e11dd5ee9e14cf5d06a657d6c4c963261b3
MD5 afdcd10354b64802472c84a7841e7c0a
BLAKE2b-256 e2b49fafe9a78c04a6cb2600f81dc97ab6cc48855748984e4d14b741ed5ce92d

See more details on using hashes here.

File details

Details for the file jupyter_cpp_tutor-0.2.2-py3-none-any.whl.

File metadata

File hashes

Hashes for jupyter_cpp_tutor-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 da7d9dc20618a19ec5c27830c1b135aadf01013cc937905b6c2685c783df81fa
MD5 25e0093fe6b8002a37baa31f7899cf8c
BLAKE2b-256 39f610b7a7d4b5ef4786bbc71be99db833aed9b4f548831edb45dccdf49f71e4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page