簡易的なデバッカー(python)

import sys

def trace_calls(frame, event, arg):
    if event != 'call':
        return
    code = frame.f_code
    func_name = code.co_name
    print(f"\n 呼び出し: {func_name}() at line {frame.f_lineno} in {code.co_filename}")
    return trace_lines

def trace_lines(frame, event, arg):
    if event != 'line':
        return
    lineno = frame.f_lineno
    filename = frame.f_code.co_filename
    local_vars = frame.f_locals
    print(f"- 実行中: line {lineno} in {filename}")
    print("変数:", local_vars)
    input("Enterキーで次の行へ...")
    return trace_lines

sys.settrace(trace_calls)

def test():
    x = 5
    y = 10
    z = x + y
    print("結果:", z)

test()

sys.settrace(None)

$ python3 debugger.py

呼び出し: test() at line 24 in /home/vagrant/dev/algorithm/basic/python/debugger.py
– 実行中: line 25 in /home/vagrant/dev/algorithm/basic/python/debugger.py
変数: {}
Enterキーで次の行へ…
– 実行中: line 26 in /home/vagrant/dev/algorithm/basic/python/debugger.py
変数: {‘x’: 5}
Enterキーで次の行へ…
– 実行中: line 27 in /home/vagrant/dev/algorithm/basic/python/debugger.py
変数: {‘x’: 5, ‘y’: 10}
Enterキーで次の行へ…
– 実行中: line 28 in /home/vagrant/dev/algorithm/basic/python/debugger.py
変数: {‘x’: 5, ‘y’: 10, ‘z’: 15}
Enterキーで次の行へ…
結果: 15

rustでは実行時フックがない

use std::io::{self, Write};

fn pause() {
   print!("Enterキーで次のステップへ...");
   io::stdout().flush().unwrap();
   let _ = io::stdin().read_line(&mut String::new());
}

fn main() {
   println!("📍 デバッグ開始");

   let x = 5;
   println!("🔍 x = {}", x);
   pause();

   let y = 10;
   println!("🔍 y = {}", y);
   pause();

   let z = x + y;
   println!("🔍 z = x + y = {}", z);
   pause();

   println!("✅ 結果: {}", z);
}