Я пытаюсь отладить использование Python WinPDB, и у меня есть несколько поточных обработок использования потоков. Поток. Я, никогда может казаться, не управляю потоками индивидуально. Если я повреждаю выполнение, все повреждения сценария. Если я ступаю через исходный код одного потока, все другие продолжают чередоваться и продолжать часть их выполнения. Это верно с включенной или выключенной Синхронностью. Разве там путь не состоит в том, чтобы ступить через поток индивидуально при хранении других в точке останова?
Действительно ли WinPDB является неправильным инструментом для использования для этого? Я просто не знаю, что использовать. Eclipse PyDev едва работает вообще, потому что сам отладчик, кажется, получает ошибки гонки при запуске нескольких потоков.
Что такое инструмент, который на самом деле надежно отладит многопоточную программу Python?
Спасибо.
У меня была аналогичная проблема, это не самый лучший ответ, но я опишу ее для вас, и, возможно, вы сможете с ней справиться.
Я более-менее написал мини-отладчик. Udp Client / Server и функция, которая ничего не делала, кроме захвата глобальной блокировки, засыпала 0,1 секунды и затем отпускала ее. Эта функция передается каждому потоку. Затем я вызвал эту функцию между критическими областями, которые я хотел отладить. После запуска программы udp-сервер будет прослушивать клиента, и если я наберу «паузу», он захватит ту же глобальную блокировку, что и разделяемую функцию, и не откажется от нее, пока я не наберу «play» в клиенте. Таким образом, вы можете получить довольно жесткий стоп ... в зависимости от приложения.
Надеюсь, это поможет ... Небольшой фрагмент ниже. Мое приложение предназначалось для тестовой платформы, поэтому я добавил указатель на функцию в конструктор базового класса и использовал его вместо 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()