Python程序在树莓派Zero 2上卡住,如何打印最后执行的代码行?
解决Python程序卡住时定位最后执行代码行的方法
方法1:用内置trace模块实时追踪
直接用Python的trace模块运行你的脚本,它会实时打印每一行代码的执行情况,程序卡住时,终端最后输出的那行就是卡住前执行的代码。
运行命令:
python -m trace --trace your_script.py
缺点是输出内容较多,但胜在简单直接,不需要修改代码就能快速定位。
方法2:捕获Ctrl+C信号,打印调用栈
在程序开头添加信号处理逻辑,按下Ctrl+C时自动打印当前的调用栈信息,能清晰看到卡住时的代码调用链和最后执行的行。
把这段代码放在你原有程序的最前面:
import signal import traceback import sys def handle_sigint(signum, frame): print("\n程序终止,最后执行的代码调用栈:") traceback.print_stack(frame) sys.exit(1) # 注册Ctrl+C信号处理 signal.signal(signal.SIGINT, handle_sigint) # 下面是你的原有代码 # ...
触发Ctrl+C后,输出的栈信息里,最下方的行就是程序卡住前最后执行的代码位置。
方法3:自定义追踪函数,仅记录最后执行行
如果不想实时输出大量日志,用sys.settrace设置一个追踪函数,只悄悄记录最后执行的代码行,按下Ctrl+C时再打印出来。
代码示例:
import sys import signal last_executed_line = None def trace_calls(frame, event, arg): global last_executed_line if event == 'line': # 记录文件名、行号和函数名 last_executed_line = f"文件: {frame.f_code.co_filename}, 行号: {frame.f_lineno}, 函数: {frame.f_code.co_name}" return trace_calls def handle_sigint(signum, frame): print(f"\n程序终止,最后执行的代码行:{last_executed_line}") sys.exit(1) # 开启代码追踪 sys.settrace(trace_calls) # 注册Ctrl+C信号处理 signal.signal(signal.SIGINT, handle_sigint) # 你的原有代码 # ...
这个方法不会干扰程序正常输出,只有终止时才显示关键信息,适合输出敏感或需要精简日志的场景。
内容的提问来源于stack exchange,提问作者Marcus Bennett
相关产品推荐
相关产品推荐

