J'ai eu un problème similaire, ce n'est pas la réponse la plus idéale, mais je vais le décrire pour vous et peut-être que vous pouvez en tirer parti. J'ai plus ou moins écrit un mini débogueur. Udp Client/Serveur et une fonction qui n'a fait que capturer un verrou global, dormez .1 secondes, puis relâchez-le. Cette fonction a été transmise à chaque thread. J'ai ensuite mis un appel à cette fonction entre les zones critiques que je voulais déboguer. Après le démarrage du programme, le serveur udp écouterait le client, et si je tapais "pause", il saisirait le même verrou global utilisé par la fonction partagée, et ne l'abandonnerait pas jusqu'à ce que je tape "jouer" dans le client. Ce faisant, vous pouvez obtenir un arrêt assez serré ... en fonction de l'application.
Espérons que ça aide ... Petit extrait ci-dessous. Mon application était pour une plate-forme de test, ce que j'ai fait a été d'ajouter le pointeur de fonction au constructeur de la classe de base, et d'utiliser ceci à la place de time.sleep() .. me donnant un débugability doux. Ce que vous pouvez faire est de passer cela à chaque thread et d'ajouter des appels à la fonction pause au début et à la fin de vos fonctions, et cela vous permettra de casser, etc. J'ai supprimé certaines commandes, mais vous pouvez voir que cela peut être fait aussi vaste que vous en avez besoin.
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()
pdb ne prend pas en charge le débogage des programmes multithread. Cela devrait fonctionner avec PyDev cependant. Quel problème rencontrez-vous? –