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