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

Rez*_*deh 7 python runtime-error pythonw python-2.7

我有一个连续在服务器上运行的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.
Run Code Online (Sandbox Code Playgroud)

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

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

Abh*_*jit 5

问题

此应用程序已请求Runtime以不寻常的方式终止它.

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

演示

你需要

  1. Visual Studio 2008(Express Edition)
  2. 在_SYM_PATH中正确设置Microsoft Symbol Server
  3. Python 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);
Run Code Online (Sandbox Code Playgroud)

资源 abort_dll.cpp

#include "abort_dll.h"

__declspec(dllexport) void call_abort(void)
{
    abort();
}
Run Code Online (Sandbox Code Playgroud)

资源 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;
}
Run Code Online (Sandbox Code Playgroud)

现在编译和构建你的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()
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

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