Python中的Microsoft Visual C ++运行时错误

时间:2012-12-07 02:13:12

标签: python python-2.7 runtime-error pythonw

我有一个在服务器上连续运行的python程序,它将一些数据放入MYSQL数据库并加载一些。它还使用TCP / IP连接。问题是大约24小时后它会产生运行时错误:

Microsoft Visual C++ Runtime Library!

Runtime Error!

Program: C:\python27\pythonw.exe

This application has requested the Runtime to terminate it in an unusual way.

我点击OK python shell关闭。当我关闭所有python文件并检查Windows任务管理器时,我看到仍有一个pythonw.exe文件在那里打开!!!

我正在使用IDLE来运行我的应用程序。

3 个答案:

答案 0 :(得分:5)

<强>问题

  

此应用程序已请求运行时将其终止   不寻常的方式。

如果您在运行Windows应用程序时遇到此错误,很可能是因为您的python库中的某个地方,甚至可能来自您的python运行时,abort()例程被调用。有关更多信息以及致电abort的行为,请参阅MSDN documentation on abort

<强>演示

你需要

  1. Visual Studio 2008 (Express Edition)
  2. 在_SYM_PATH
  3. 中正确设置Microsoft Symbol Server
  4. Python 2.7
  5. 安装WinDBG,并将其设置为JIT
  6. 创建一个调用abort()的C DLL,然后使用ctypes调用此DLL

    标头文件abort_dll.h

    #include<cstdlib>
    #include <windows.h>
    
    extern "C"  __declspec(dllexport) void call_abort(void);
    

    来源abort_dll.cpp

    #include "abort_dll.h"
    
    __declspec(dllexport) void call_abort(void)
    {
        abort();
    }
    

    来源dllmain.cpp

    #include "abort_dll.h"
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    

    现在编译和构建你的DLL(在Debug和Release Version中)。

    假设我的DLL出现在以下位置

    调试版本:C:\ TEMP \ Debug \ abort_dll.dll 发行版:C:\ TEMP \ Release \ abort_dll.dll

    在IDLE

    中执行以下代码
    from ctypes import *
    hDLL = WinDLL(r"C:\TEMP\Debug\abort_dll.dll")
    hDLL.call_abort()
    

    您一定会看到以下弹出窗口

    enter image description here

    与你的情况唯一不同的是,它为你提供了臭名昭着的选项[Abort | Retry \ Ignore]。这只是因为我使用了我的DLL的Debug版本。相反,如果我使用了发布版本,我通常会看到

    enter image description here

    <强>解决方案

    在Windows,AFAIK中,您无法使用信号处理程序处理SIGABRT。所以,唯一的赌注是使用JIT,我想你已经安装了。然后你会看到以下弹出窗口。

    enter image description here

    如果选择Debug,将打开已安装的JIT调试器。之后,您可以转储发生故障的堆栈,并确定发生故障的模块。完成后,您可以关联可能已调用模块的python模块。

答案 1 :(得分:3)

在我之前的回答中,我试图介绍报告行为的原因以及如何调试和确定根本原因。不幸的是,这需要大量的调试知识和时间来隔离问题。

或者,Process Monitor可以很方便地提供对问题的高度理解,这可能是用户可能需要的。

需要的工具

  1. Process Monitor
  2. 调试步骤

    1. 运行Process Monitor
    2. 添加以下过滤器(Cntrl + F)

      1. 进程名称 - 以--python
      2. 开头
      3. 操作 - 以 - CreateFile
      4. 开头

        enter image description here

      5. 现在继续运行procmon,直到你的应用程序崩溃
      6. 停止捕捉(Cntrl + E)
      7. 在LOG中搜索对WerFault.exe的调用

        enter image description here

      8. 逐渐向上滚动以查看可能与Python相关的最后一个名为Non Windows DLL。在上面的例子中,它的abort_dll.dll。

      9. 现在使用您的Python库知识,或者询问(包括SO),以确定可能出现的失败。甚至,从日志中,您可以通过进一步向上滚动来识别哪个Python模块称为此DLL。

答案 2 :(得分:0)

我能够通过消除已启动但尚未显示的图来解决同样的问题。那是:

plt.plot(dI_new[ref:idx_stop], w_new[ref:idx_stop], 'ro') #x,y
plt.xlabel('Strain')
plt.ylabel('Stress, kPa')
##plt.axis([0, 6, 0, 20])
##plt.show()

我修好了:

##plt.plot(dI_new[ref:idx_stop], w_new[ref:idx_stop], 'ro') #x,y
##plt.xlabel('Strain')
##plt.ylabel('Stress, kPa')
##plt.axis([0, 6, 0, 20])
##plt.show()

错误不再显示。