【问题标题】:pdb cannot break in another thread?pdb 不能中断另一个线程?
【发布时间】:2012-10-10 21:48:45
【问题描述】:

考虑这个多线程程序:

import threading

class SomeThread(threading.Thread):
  def run(self):
    a = 1
    print a

def main():
  print 'hola'
  someThread = SomeThread()
  someThread.start()

if __name__ == '__main__':
  main()

当我用 pdb 调试这个程序时,在提示符处我首先在两个打印语句的每一个处设置一个断点。然后我继续。 pdb 在print 'hola' 处中断。我再次继续,在另一个线程中查看打印的效果,但 pdb 没有中断。

帮助命令没有列出任何切换线程上下文的内容,例如 gdb...所以...在一个线程上下文中设置断点是不可能的,该断点将在另一个上下文中触发?

【问题讨论】:

  • 嗨,Flip,是的,我相信这是该已回答问题的副本。我没有看到标记重复的选项,也许这是我尚未解锁的操作。任何人都可以,请做。

标签: python multithreading breakpoints pdb


【解决方案1】:

这对我有用:

import threading
import pdb

class SomeThread(threading.Thread):
  def run(self):
    a = 1
    print a
    pdb.set_trace()

def main():
  print 'hola'
  pdb.set_trace()
  someThread = SomeThread()
  someThread.start()

if __name__ == '__main__':
  main()

这给了我:

C:\Code>python b.py
hola
> c:\code\b.py(13)main()
-> someThread = SomeThread()
(Pdb) l
  8         pdb.set_trace()
  9
 10     def main():
 11       print 'hola'
 12       pdb.set_trace()
 13  ->   someThread = SomeThread()
 14       someThread.start()
 15
 16     if __name__ == '__main__':
 17       main()
[EOF]
(Pdb) c
1
--Return--
> c:\code\b.py(8)run()->None
-> pdb.set_trace()
(Pdb) l
  3
  4     class SomeThread(threading.Thread):
  5       def run(self):
  6         a = 1
  7         print a
  8  ->     pdb.set_trace()
  9
 10     def main():
 11       print 'hola'
 12       pdb.set_trace()
 13       someThread = SomeThread()
(Pdb)

这是在 Windows 7 和 Python 2.7.2 下。您使用的是什么操作系统和 Python 版本?

【讨论】:

  • 我认为这个问题与调试器中设置的断点有关:(Pdb) b 8 - print 语句上的断点。主线程执行断点,但子线程不执行。
【解决方案2】:

在您遇到第一个断点后,我假设您正在使用 (n) 下一行 当你到达这条线时

someThread.start()

确保您使用的是 (s) step-into 而不是 (n) next。 pdb commands

【讨论】:

  • 如果在调用堆栈的下方有一个断点,无论是 's' 还是 'n',它都会命中它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多