关闭时Python解释器崩溃

时间:2014-01-13 20:49:03

标签: python windows crash

我正在为一个托管SWIGged(非常)大型C ++扩展模块的遗留Python应用程序中重新安装正常关闭的过程。我在翻译关闭期间遇到了崩溃,我没有想法,所以我希望你能帮我解决原因。

以上是我目前收集的信息:

  • 在Windows上运行Python 2.7.2,32位;
  • 应用程序启动的所有C ++线程都是(AFAICT)关闭并正确连接;
  • 应用程序启动的所有Python线程都是(AFAICT)关闭并正确连接(它们被标记为守护进程,以避免作为最后的手段挂起,但它们都已加入);
  • Process Explorer(Sysinternals)显示少量具有"起始地址"的线程。在ntdll.dll!TpCallbackIndependent+0x238;
  • Process Explorer显示一个带有"起始地址"的线程。在ntdll.dll!RtlMoveMemory+x5a5;
  • 当应用程序退出时(成功加入所有线程后),ntdll.dll中的线程仍在运行,退出状态为1;
  • 到此时,我的所有日​​志记录和诊断工具都已关闭。

TpCallbackIndependent似乎与Windows Thread Pool API相关,此应用程序使用 。我可以列出所有外部Python库,如果它对你来说意味着什么,但我不认为它们中的任何一个都使用它。


编辑:可能的罪魁祸首是pycurl模块。我发出第一个pycurl.Curl.perform()后,RtlMoveMemorymswsock个主题就会启动。即使我调用pycurl.global_cleanup()(此时mswsock线程消失,RtlMoveMemory线程也永远不会完成,TpCallbackIndependent虚假地出现并在此之后永远消失。

pycurl.version打印" libcurl / 7.20.1 OpenSSL / 0.9.8q zlib / 1.2.5"我不知道pycurl版本是什么(我只有.pyd文件。)


编辑:这是一个示例Pycurl程序,可以创建有问题的线程。出于某种原因,我无法解释,这个特殊的调用并没有崩溃......

import cStringIO
import pycurl
import sys

pycurl.global_init(pycurl.GLOBAL_DEFAULT)
try:
    b = cStringIO.StringIO()
    # Issue request.
    c = pycurl.Curl()
    try:
        c.setopt(pycurl.CUSTOMREQUEST, 'GET')
        c.setopt(c.URL, 'http://www.google.ca')
        c.setopt(c.WRITEFUNCTION, b.write)

        print 'Type anything to issue the request.'
        sys.stdin.readline()
        c.perform()

        # Threads appear as a result of the `.perform()`
        # operation.  If you monitor the active threads
        # in "process explorer", you see that the threads
        # appear here.
    finally:
        c.close()
        del c
finally:
    print 'Type anything to cleanup.'
    sys.stdin.readline()
    pycurl.global_cleanup()

# If you're still looking at active threads in "process
# explorer", you see that some threads (the mswsock.dll
# thread in particular) have disappeared, but there are still
# weird TpCallbackIndependent threads showing up.

print 'Type anything to exit.'
sys.stdin.readline()

1 个答案:

答案 0 :(得分:0)

在调用清理之前,请确保关闭所有pycurl对象。这包括简单,共享和多个对象。