PDB - 如何暂停所有线程
PDB - How to suspend all threads
当多线程 Python 程序遇到断点时,相关线程将停止,但其他线程将继续 运行。在某些情况下,这可能会成为调试的障碍。
例如,在test.py
中:
from threading import Thread
from time import sleep
def thread1():
while True:
sleep(1)
print("hello")
def thread2():
breakpoint()
Thread(target=thread1).start()
Thread(target=thread2).start()
将导致以下调试会话:
$ python test.py
--Return--
> /.../test.py(12)thread2()->None
-> breakpoint()
(Pdb) hello
hello
hello
hello
...
如您所见,thread1
中的 print
语句干扰了 thread2
中的调试会话。
在PyCharm的调试器中,可以挂起所有线程:PyCharm - how to suspend all threads
是否可以挂起PDB中的所有线程?
目前不支持。 pdb
调试器不适合调试 multi-threaded 应用程序。
- Issue 21281 - 这是一个 6 年前的增强请求,支持在触发断点时停止所有线程。它没有受到太多关注。
- Issue 41571 - 这是最近的增强请求,旨在为 pdb 添加更好的线程支持。
- Python Wiki 中的 PythonDebugTools 页面列出了支持调试 multi-threaded 应用程序的调试器和 IDE。
当多线程 Python 程序遇到断点时,相关线程将停止,但其他线程将继续 运行。在某些情况下,这可能会成为调试的障碍。
例如,在test.py
中:
from threading import Thread
from time import sleep
def thread1():
while True:
sleep(1)
print("hello")
def thread2():
breakpoint()
Thread(target=thread1).start()
Thread(target=thread2).start()
将导致以下调试会话:
$ python test.py
--Return--
> /.../test.py(12)thread2()->None
-> breakpoint()
(Pdb) hello
hello
hello
hello
...
如您所见,thread1
中的 print
语句干扰了 thread2
中的调试会话。
在PyCharm的调试器中,可以挂起所有线程:PyCharm - how to suspend all threads
是否可以挂起PDB中的所有线程?
目前不支持。 pdb
调试器不适合调试 multi-threaded 应用程序。
- Issue 21281 - 这是一个 6 年前的增强请求,支持在触发断点时停止所有线程。它没有受到太多关注。
- Issue 41571 - 这是最近的增强请求,旨在为 pdb 添加更好的线程支持。
- Python Wiki 中的 PythonDebugTools 页面列出了支持调试 multi-threaded 应用程序的调试器和 IDE。