我想将断点命令保存在
.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 提示符下输入 NameError
后,由于 end
、foo.attr1
甚至 foo.attr2
,它会引发 end
。其余断点也会发生同样的情况,所以我最终设置了它们,但没有设置它们的命令。
执行此操作的正确方法是什么?还可能吗?
我的第一个想法是命令必须定义在一行上:
commands 1;; pp foo.attr1;; pp foo.attr2;; end;;
但是,这似乎只能在提示符下起作用,并且您将错误地得到:
Usage : commands [bnum]
...
end
如果将上面的行放在 .pdbrc 中
查看 pdb.py 看来作者没有正确处理 pdbrc 中的定义命令。
我个人会暂时将打印行放在我正在调试的代码中,同时使用 pdbrc 保存感兴趣的断点来解决这个问题。
您可能不希望每次在任何地方使用 pdb 时都进行此设置。我的建议是设置一个别名,例如:
alias setup_myproj b 81;; commands 1;; pp foo.attr1;; pp foo.attr2;; end
然后您可以在适当的时候运行
setup_myproj
。
今天(2023 年 6 月)这个问题仍然没有解决,这对我有用:
$ echo 'run;; b 81;; cont;; pp foo.attr1;;' | python3 -m pdb main.py
或者,将命令放入
commands.txt
(作为单行)并运行:
$ cat commands.txt | python3 -m pdb main.py
编辑:
看起来这个问题现在已经通过 PR 110496
解决了原文:
十多年过去了,但不幸的是,当从
pdb
文件读取 end
时,看起来 commands
仍然无法正确处理 .pdbrc
命令。现在有一个与 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
...
显然,这仅适用于您知道接下来将到达哪个断点的简单情况。