【问题标题】:Microsoft Visual C++ Runtime Error in PythonPython 中的 Microsoft Visual C++ 运行时错误
【发布时间】:2012-11-25 05:00:56
【问题描述】:

我有一个在服务器中连续运行的 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 运行我的应用程序。

【问题讨论】:

  • 当我运行 python 程序超过 3 小时左右时,我遇到了同样的问题。我的程序在 Python 2.7 中使用 Tkinter、Threads 和 ftplib ..
  • 没有源代码,无法提供帮助。
  • 这需要一些广泛的调试技能和时间来隔离问题。
  • 您是否尝试过从命令行而不是 IDLE 运行应用程序?
  • @mguijarr 在另一个问题中添加了示例代码stackoverflow.com/questions/19155297/…

标签: python python-2.7 runtime-error pythonw


【解决方案1】:

问题

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

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

演示

你需要

  1. Visual Studio 2008 (Express Edition)
  2. 在 _SYM_PATH 中正确设置 Microsoft Symbol Server
  3. Python 2.7
  4. 安装WinDBG,并将其设置为JIT

创建一个调用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(调试版和发布版)。

假设我的 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()

你一定会看到以下弹窗

与您的案例的唯一区别是,它为您提供了臭名昭著的选项 [Abort|Retry\Ignore]。这只是因为我使用了我的 DLL 的调试版本。相反,如果我使用的是发布版本,我通常会看到

解决方案

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

如果您选择“调试”,则会打开已安装的 JIT 调试器。之后,您可以转储失败的堆栈,并确定失败的模块。完成后,您可以关联可能调用该模块的 python 模块。

【讨论】:

【解决方案2】:

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

或者,Process Monitor 可以方便地提供对问题的高级理解,作为用户可能需要发布。

所需工具

  1. Process Monitor

调试步骤

  1. 运行进程监视器
  2. 添加以下过滤器(Cntrl + F)

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

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

  6. 逐渐向上滚动以查看最后调用的可能与 Python 相关的非 Windows DLL。在上述情况下,它的 abort_dll.dll。

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

【讨论】:

    【解决方案3】:

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

    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()
    

    错误不再出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 2018-04-25
      相关资源
      最近更新 更多