8

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

4

3 回答 3

5

问题

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

如果您在运行 Windows 应用程序时收到此错误,很可能是因为在您的 python 库中的某个地方,甚至可能从您的 python 运行时abort()调用了例程。有关更多信息和调用行为,abort请参阅MSDN 文档中止

演示

你需要

  1. Visual Studio 2008(快捷版)
  2. 在 _SYM_PATH 中正确设置Microsoft 符号服务器
  3. 蟒蛇 2.7
  4. 安装WinDBG,并将其设置为JIT

创建一个调用 C DLL,abort()然后使用 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()

你一定会看到下面的Popup

在此处输入图像描述

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

在此处输入图像描述

解决方案

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

在此处输入图像描述

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

于 2013-10-02T05:58:29.357 回答
3

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

或者,进程监视器可以方便地对问题进行高级理解,作为用户可能需要发布。

所需工具

  1. 进程监视器

调试步骤

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

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

    在此处输入图像描述

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

    在此处输入图像描述

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

  7. 现在使用您的 Python 库知识,或询问(包括 SO),以确定可能是什么失败。甚至,从日志中,您可以通过进一步向上滚动来识别哪个 Python 模块调用了这个 DLL。
于 2013-10-02T06:27:29.140 回答
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()

该错误不再出现。

于 2018-03-07T04:03:51.403 回答