在pdb中添加断点显示"文件结束"?

0 投票
1 回答
18 浏览
提问于 2025-04-13 17:46

我真是受够了这个……

好吧,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

现在,仍然有一个问题,就是断点并没有被触发,尽管我看到对应行的输出(“正在分析代码”)被打印出来 - 但那是另一个问题……

撰写回答