2010-08-05 35 views
8

我想使用WinPDB调试Python,并且我有多个使用threading.Thread的线程。我似乎永远不会单独控制线程。如果我中断执行,整个脚本就会中断。如果我单步执行一个线程的源代码,则其他所有其他线程继续进行交错并继续其一些执行。在打开或关闭Synchronicity时,情况属实。没有一种方法可以单独通过一个线程,同时让其他人处于断点?如何独立完成Python线程? (WinPDB)

WinPDB是错误的工具吗?我只是不知道该用什么。 Eclipse PyDev几乎没有任何作用,因为调试器本身似乎在启动多个线程时出现竞争错误。

什么是实际上的工具调试多线程Python程序?

谢谢。

+0

PDB不支持调试多线程程序。这应该与PyDev一起工作。你遇到什么问题? – 2010-08-07 13:47:37

回答

1

我有类似的问题,这不是最理想的答案,但我会为你描述它,也许你可以解决它。

我或多或少地写了一个迷你调试器。 Udp客户端/服务器和一个除了获取全局锁定之外什么也不做的函数,睡眠1秒,然后释放它。这个函数被传递给每个线程。然后我打电话给我想调试的关键区域之间的这个函数。启动程序后,udp服务器将监听客户端,如果我输入“pause”,它将获取共享函数使用的同一个全局锁,并且不会放弃,直到我在客户端中键入“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() 
+0

我不完全理解第一个回答者用这个UDP客户端/服务器做什么。 PyDev不起作用,因为它会在调试器尝试写入状态信息的某个XML文件中出现这些奇怪的错误。也许它有多个线程在运行多线程程序的同时尝试写入文件,并且未设置为处理该线程。 – MMM 2010-08-12 18:21:03

+0

对不起,从未使用pyDev – pyInTheSky 2010-08-23 15:50:49