Python pdb中能否限制where命令显示的当前栈周围层级数?
在pdb中限制
where命令的栈层级显示 当然可以,针对递归深度过大的场景,有两种实用方法来只显示当前栈位置周围的层级:
方法1:用where原生参数指定范围
pdb的where(缩写w)命令支持手动指定要显示的栈帧范围,语法是:
where [first [last]]
- 只传
first:显示从编号first到当前帧的所有栈帧 - 传
first和last:显示编号从first到last-1的栈帧(左闭右开)
操作步骤:
- 输入
frame查看当前帧的编号(比如输出Current frame is 0,0就是当前执行的最内层帧) - 计算范围:比如要显示当前帧前后2层,假设当前帧编号是
k,则起始编号为max(0, k-2),结束编号为k+3(因为last是开区间,所以要+1) - 执行命令,比如
where 0 5就会显示当前帧及上面4层的栈信息
如果只想看当前帧往上的n层,直接用where -n,比如where -5会显示当前帧及其上面4层,共5帧。
方法2:自定义便捷命令
如果经常需要查看周围层级,自定义一个pdb命令会更省心,不用每次计算编号。
在pdb会话中直接输入以下代码:
def wnear(n=2): import inspect # 收集栈帧信息,排除pdb自身的调用帧 stack = [] frame = inspect.currentframe().f_back.f_back while frame: stack.append((frame.f_code.co_filename, frame.f_lineno, frame.f_code.co_name)) frame = frame.f_back stack.reverse() # 反转后,索引0是最外层调用,最后一位是当前帧 current_idx = len(stack) - 1 # 确定显示的起止范围 start = max(0, current_idx - n) end = min(len(stack), current_idx + n + 1) # 格式化打印 for i in range(start, end): filename, lineno, func = stack[i] marker = ">" if i == current_idx else " " print(f"{marker} [{i}] {filename}:{lineno} in {func}()")
之后输入wnear 3就能显示当前帧前后3层,不带参数默认显示前后2层。
如果想每次启动pdb都能用这个命令,把上述代码放到你的~/.pdbrc文件里就行,pdb启动时会自动加载。
内容的提问来源于stack exchange,提问作者quazgar
相关产品推荐
相关产品推荐

