You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python PDB条件断点实现及调用上下文信息获取技术问询

条件断点实现与调用信息获取的解决方案

1. 实现条件断点的其他标准方法

其实Python本身的调试工具就支持原生的条件断点功能,完全不用手动写全局变量和判断函数:

  • 使用pdb(Python内置调试器):在pdb会话里,你可以用break <filename>:<lineno>, <condition>来设置条件断点。比如想在test.py的第20行,当STOP_LEVEL == 2时触发断点,就输入break test.py:20, STOP_LEVEL == 2,调试时只有满足条件才会停下来,非常直观。
  • IDE集成调试器:像PyCharm、VS Code这类IDE的调试面板里,都支持给断点添加条件表达式,直接在断点图标上右键设置条件就行,比手动写代码埋点更灵活,还不用修改业务代码。
  • 当然你自己写的mbp函数也很实用,适合在代码里提前埋好调试点,通过修改全局变量快速触发,适合临时调试或者在没有IDE的环境下使用。

2. 获取调用mbp的上下文信息(文件名、函数名、行号)

要获取调用mbp的位置信息,Python的inspect模块是最佳选择,它能直接访问调用栈的帧数据。修改你的mbp函数如下:

import inspect
import logging

# 初始化日志
logging.basicConfig(level=logging.INFO)
mlog = logging.getLogger(__name__)

STOP_LEVEL = 0

def mbp(sl=-1):
    if sl == STOP_LEVEL:
        # 获取调用栈的第1层(第0层是mbp函数自身)
        caller_info = inspect.stack()[1]
        # 从栈帧中提取所需信息
        file_path = caller_info.filename
        func_name = caller_info.function
        line_number = caller_info.lineno
        # 打印日志
        mlog.info("break point at %s:%d, called from function: %s", file_path, line_number, func_name)
        # 触发断点
        breakpoint()

补充优化:

如果担心inspect.stack()的性能(它会遍历整个调用栈),可以改用inspect.currentframe().f_back直接获取上一层帧,这种方式只获取直接调用者的帧,性能更好:

caller_frame = inspect.currentframe().f_back
file_path = caller_frame.f_code.co_filename
func_name = caller_frame.f_code.co_name
line_number = caller_frame.f_lineno

内容的提问来源于stack exchange,提问作者Ahmad

火山引擎 最新活动