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); }