我正在尝试使用 WinPDB 调试 Python,并且我有多个使用 threading.Thread 的线程。我似乎永远无法单独控制线程。如果我中断执行,整个脚本就会中断。如果我单步执行一个线程的源代码,所有其他线程将继续交错并继续执行它们的某些部分。同步性打开或关闭时都是如此。有没有一种方法可以单独单步执行一个线程,同时将其他线程保持在断点处?
WinPDB 是否是用于此目的的错误工具?我只是不知道该用什么。 Eclipse PyDev 几乎无法工作,因为调试器本身在启动多线程时似乎会出现竞争错误。
什么工具可以真正稳健地调试多线程 Python 程序?
谢谢。
最佳答案
我有一个类似的问题,这不是最理想的答案,但我会为您描述它,也许您可以解决它。
我或多或少写了一个迷你调试器。 Udp Client/Server 和一个除了获取全局锁,休眠 .1 秒,然后释放它之外什么都不做的函数。这个函数被传递给每个线程。然后我在我想要调试的关键区域之间调用了这个函数。启动程序后,udp 服务器会监听客户端,如果我输入“暂停”,它会获取共享函数使用的相同全局锁,直到我在客户端输入“播放”后才会放弃。因此,这样做,您可以获得相当紧的止损……具体取决于应用。
希望对您有所帮助...下面的小片段。我的应用程序是针对测试平台的,所以我所做的是将函数指针添加到基类构造函数,并使用它代替 time.sleep() .. 给我温和的调试能力。你可以做的是将它传递给每个线程,并在函数的开头和结尾添加对暂停函数的调用,这样你就可以中断等等。我删除了一些命令,但你可以看到这可以是尽可能广泛地满足您的需求。
PAUSE_NOW = thread.allocate_lock()
def pause(s):
'''
FUNCTION: testStatus
DESCRIPTION: function passed to all test objects
INPUTS: none
RETURNS: none
'''
global Pause_NOW
PAUSE_NOW.acquire()
time.sleep(s)
PAUSE_NOW.release()
`
def server():
'''
\r\n
FUNCTION: server
DESCRIPTION: UDP server that launches a UDP client. The client it
starts can issue commands defined in cmdlineop. Most
functions return a status, but some are meant to block
the main thread as a means of pausing a test, in which case
a default response is returned.
INPUTS: none
RETURNS: none
'''
global EXIT
global Pause_NOW
host = "localhost"
port = 21567
buf = 1024
addr = (host,port)
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)
sleep(1)
os.startfile('client.py')
#os.system('start python client.py')
cmdlineop = {
'pausenow' : "PAUSE_NOW.acquire()",
'playnow' : "PAUSE_NOW.release()",
}
while 1:
output = 'RECEIVED CMD'
# if EXIT: break
data,addr = UDPSock.recvfrom(buf)
if not data:
break
else:
if cmdlineop.has_key(data.split()[0]):
exec(cmdlineop[(data.split()[0])])
UDPSock.sendto(('\n'+output+'\n'),addr)
data = ''
else:
UDPSock.sendto('INVALID CMD',addr)
UDPSock.close()
关于python - 如何独立单步执行 Python 线程? (WinPDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3417212/