Tôi gặp vấn đề tương tự, đó không phải là câu trả lời lý tưởng nhất, nhưng tôi sẽ mô tả nó cho bạn và có thể bạn có thể làm việc đó.
Tôi ít nhiều đã viết một trình gỡ lỗi nhỏ. Udp Client/Server và một chức năng mà không làm gì ngoài lấy một khóa toàn cầu, ngủ .1 giây, và sau đó phát hành nó. Hàm này đã được chuyển cho mỗi luồng. Sau đó tôi đặt một cuộc gọi đến chức năng này giữa các khu vực quan trọng mà tôi muốn gỡ lỗi. Sau khi bắt đầu chương trình, máy chủ udp sẽ lắng nghe máy khách và nếu tôi gõ "tạm dừng", nó sẽ lấy cùng một khóa toàn cục được sử dụng bởi hàm chia sẻ, và không cho nó lên cho đến khi tôi gõ "play" trong máy khách. Vì vậy, làm điều này, bạn có thể nhận được một điểm dừng khá chặt chẽ ... tùy thuộc vào ứng dụng.
Hy vọng nó sẽ giúp ... Đoạn mã nhỏ bên dưới. Ứng dụng của tôi là cho một nền tảng thử nghiệm vì vậy những gì tôi đã làm là thêm con trỏ hàm vào hàm tạo lớp cơ sở, và sử dụng nó thay vì time.sleep() .. cho tôi khả năng gỡ lỗi nhẹ. Những gì bạn có thể làm là truyền điều này cho mỗi luồng và thêm các cuộc gọi vào chức năng tạm dừng ở đầu và cuối các chức năng của bạn, và nó sẽ cho phép bạn ngắt, v.v. Tôi đã xóa một số lệnh nhưng bạn có thể thấy rằng điều này có thể được làm rộng khi bạn cần.
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 không hỗ trợ gỡ lỗi chương trình đa luồng. Điều này sẽ làm việc với PyDev mặc dù. Bạn đang có vấn đề gì vậy? –