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.3.tar.gz (31.2 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.3-py3-none-any.whl (26.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: jupyter_cpp_tutor-0.2.3.tar.gz
  • Upload date:
  • Size: 31.2 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.3.tar.gz
Algorithm Hash digest
SHA256 67ceec0791407c1120463983838bb2bd100b148b3054b07f2c01a540e66fe19c
MD5 82120c757e97f2fba10b7f738572814c
BLAKE2b-256 5067c6fb05f37c4d0b0cfec1c69f2a53fc9ef39462dc6a99e0b4eacbe7142d35

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for jupyter_cpp_tutor-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 e16fa2709b248898983700064f2baa59c4c3dfd28b7bc5a118c892568e57ea86
MD5 79e05707d336cc7f2b166acb72cec42d
BLAKE2b-256 62f68b949ff7f5a8a44886aff8f0b503690df59f1fa2185e002f0dc181cd00f5

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