在.pdbrc文件中用于断点的命令

7
我想要将断点的命令保存在 .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。对于其余断点也是同样情况,所以我最终只设置了断点但没有设置命令。
那么正确的方法是什么?这种方法是否可行?

1
我在苦苦挣扎......你能做到吗? - manu
4个回答

2

我的第一个想法是该命令必须在一行上定义:

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

然而,看起来这只能在提示符下工作,否则你会错误地得到:

Usage : commands [bnum]
        ...
        end

如果您将上述行放入.pdbrc文件中

查看pdb.py,似乎该作者没有正确处理在pdbrc中定义命令的情况。

个人而言,我会在使用pdbrc保存感兴趣的断点时,暂时将打印行放入我要调试的代码中以避免这种问题。


1

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

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

然后在适当的时候可以运行setup_myproj


在没有别名的情况下,在本地.pdbrc文件中设置这个应该不是问题。根据文档:“如果用户的主目录或当前目录中存在.pdbrc文件,则会读取该文件。如果两个文件都存在,则首先读取主目录中的文件,并且在那里定义的别名可以被本地文件覆盖。” - djvg

0

十多年过去了,但不幸的是,看起来 pdb 仍然无法正确处理从 .pdbrc 文件中读取 commands 命令时的 end 命令。现在有一个相关的 issue 用于 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
...

显然,这仅适用于简单情况,您知道下一个断点将在哪里到达。


0

到今天(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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接