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-gdebug 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
- Standard
#includeheaders are prepended (if not already present) - A
#line 1 "user.cpp"directive ensures GDB line numbers match your source 1:1 - The code is compiled with
g++ -g -O0 -std=c++23 - 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/mallocpointers)
- Sets breakpoints on
- 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jupyter_cpp_tutor-0.1.0.tar.gz.
File metadata
- Download URL: jupyter_cpp_tutor-0.1.0.tar.gz
- Upload date:
- Size: 28.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f5f4e97f0c9db1553f2cb16b26010d6aa70d7fb1551e86e99e6c9d09815764f4
|
|
| MD5 |
471f7cb27200b3ac1506a4d180050f62
|
|
| BLAKE2b-256 |
852d33439067b209865bf81519f500f9b41ef8e8aaec54975ac410cdbf577917
|
File details
Details for the file jupyter_cpp_tutor-0.1.0-py3-none-any.whl.
File metadata
- Download URL: jupyter_cpp_tutor-0.1.0-py3-none-any.whl
- Upload date:
- Size: 23.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bbe65ccc0bc1dc7984c5c9037fac912976ea30e708524fe884a65bd56ce7773c
|
|
| MD5 |
41d4c24bd42be823207d5d735074e6fe
|
|
| BLAKE2b-256 |
b56b34380c090238fc772da1ec57e9591c2446231a4beffa75ca23bb5f81e5bf
|