.pdbrc 文件中的断点命令
我想把调试时的命令保存到一个叫 .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.attr1
、foo.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 保存我感兴趣的断点,这样可以绕过这个问题。