.pdbrc 文件中的断点命令

7 投票
4 回答
1470 浏览
提问于 2025-04-15 17:42

我想把调试时的命令保存到一个叫 .pdbrc 的文件里,类似这样:

b 81 
commands 1 
pp foo.attr1 
pp foo.attr2 
end 
b 108 
commands 2 
pp bar.attr1 
pp bar.attr2 
end 

这样做可以自动设置调试环境。不过,这在用 python -m pdb script.py 启动时不太管用,因为在 commands 1 这一行,pdb 提示符会出现,要求我输入第一个断点的命令,完全不理会我在 .pdbrc 里写的内容。而且,当我在 pdb 提示符输入 end 后,还会出现 NameError 错误,因为它找不到 foo.attr1foo.attr2 甚至 end。其他断点也是这样,所以我虽然设置了断点,但命令却没有生效。

那正确的做法是什么呢?这样做真的可行吗?

4 个回答

1

编辑:

看起来这个问题已经通过 PR 110496 解决了。

原文:

十多年过去了,但不幸的是,pdb 似乎仍然无法正确处理从 .pdbrc 文件中读取的 end 命令。现在,关于这个问题在 cpython 上有一个相关的 问题

在此期间,对于 简单的控制流程,可以通过 使用 commands 命令来规避这个问题。例如,你可以这样做:

# set the breakpoints
b 81 
b 108 
# continue to the first breakpoint
continue 
# execute commands at first breakpoint
pp foo.attr1 
pp foo.attr2 
# continue to the second breakpoint
continue
# execute commands at second breakpoint
pp bar.attr1 
pp bar.attr2
...

显然,这种方法只适用于你知道下一个会到达哪个断点的简单情况。

1

你可能不希望每次在任何地方使用pdb时都设置这个。我的建议是设置一个别名,比如:

alias setup_myproj b 81;; commands 1;; pp foo.attr1;; pp foo.attr2;; end

这样你就可以在合适的时候运行 setup_myproj 了。

2

我最开始的想法是,这个命令必须写在一行里:

commands 1;; pp foo.attr1;; pp foo.attr2;; end;;

不过,看起来这个方法只在命令提示符下有效,如果你把上面的代码放在 .pdbrc 文件里,你会得到错误的结果:

Usage : commands [bnum]
        ...
        end

pdb.py 的代码来看,作者似乎没有正确处理在 pdbrc 文件中定义命令的情况。

我个人的做法是,在调试代码的时候,暂时把打印语句放到我正在调试的代码里,同时用 pdbrc 保存我感兴趣的断点,这样可以绕过这个问题。

撰写回答