在pdb中添加断点显示"文件结束"?
我真是受够了这个……
好吧,pdb: 在不在 sys.path 中的文件上设置断点提到:
根据这个回答,你也可以通过写出文件的完整路径来设置断点。
我之前试过一次,确实有效。
现在我正在调试另一个脚本:
$ python3 -m pdb freeze.py
> c:/tmp/mytest/freeze.py(9)<module>()
-> import py2exe
(Pdb) n
> c:/tmp/mytest/freeze.py(10)<module>()
-> from py2exe import freeze
(Pdb) b /mingw64/lib/python3.11/site-packages/py2exe/runtime.py:166
End of file
(Pdb) b
(Pdb)
为了证明那个文件和第166行确实存在:
$ awk 'NR >= 165 && NR <= 167 {printf "%d\t%s\n", NR, $0}' /mingw64/lib/python3.11/site-packages/py2exe/runtime.py
165 def analyze(self):
166 logger.info("Analyzing the code")
167
那问题出在哪里呢?为什么我不能设置断点,反而得到“文件结束”的提示?我该怎么正确设置断点,让它生效呢?
1 个回答
1
好的,我在这里找到了那个错误信息:https://github.com/python/cpython/blob/a50cf6c/Lib/pdb.py#L1084:
...
line = linecache.getline(filename, lineno, globs)
if not line:
self.message('End of file')
return 0
...
... 所以问题出在 linecache.getline
这个地方。
现在,我是在 Windows 10 下使用 MINGW64 的 Python3;MINGW64 的 bash
终端通常接受 Linux 风格的路径,但结果发现,Python3(或者至少是 linecache
)并不接受 - 这是在 pdb
中遇到的:
(Pdb) import linecache
(Pdb) linecache.getline("/mingw64/lib/python3.11/site-packages/py2exe/runtime.py", 166, None)
''
(Pdb) linecache.getline("C:/msys64/mingw64/lib/python3.11/site-packages/py2exe/runtime.py", 166, None)
' logger.info("Analyzing the code")\n'
所以,显然我需要指定完整的路径,并加上 Windows 的驱动器前缀(C:
),仅仅用 Linux 风格的完整路径是行不通的:
(Pdb) b C:/msys64/mingw64/lib/python3.11/site-packages/py2exe/runtime.py:166
Breakpoint 1 at c:/msys64/mingw64/lib/python3.11/site-packages/py2exe/runtime.py:166
现在,仍然有一个问题,就是断点并没有被触发,尽管我看到对应行的输出(“正在分析代码”)被打印出来 - 但那是另一个问题……