我有一个在服务器上连续运行的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来运行我的应用程序。
答案 0 :(得分:5)
<强>问题强>
此应用程序已请求运行时将其终止 不寻常的方式。
如果您在运行Windows应用程序时遇到此错误,很可能是因为您的python库中的某个地方,甚至可能来自您的python运行时,abort()
例程被调用。有关更多信息以及致电abort
的行为,请参阅MSDN documentation on abort
<强>演示强>
你需要
创建一个调用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()
您一定会看到以下弹出窗口
与你的情况唯一不同的是,它为你提供了臭名昭着的选项[Abort | Retry \ Ignore]。这只是因为我使用了我的DLL的Debug版本。相反,如果我使用了发布版本,我通常会看到
<强>解决方案强>
在Windows,AFAIK中,您无法使用信号处理程序处理SIGABRT
。所以,唯一的赌注是使用JIT,我想你已经安装了。然后你会看到以下弹出窗口。
如果选择Debug,将打开已安装的JIT调试器。之后,您可以转储发生故障的堆栈,并确定发生故障的模块。完成后,您可以关联可能已调用模块的python模块。
答案 1 :(得分:3)
在我之前的回答中,我试图介绍报告行为的原因以及如何调试和确定根本原因。不幸的是,这需要大量的调试知识和时间来隔离问题。
或者,Process Monitor可以很方便地提供对问题的高度理解,这可能是用户可能需要的。
需要的工具
调试步骤
添加以下过滤器(Cntrl + F)
在LOG中搜索对WerFault.exe的调用
逐渐向上滚动以查看可能与Python相关的最后一个名为Non Windows DLL。在上面的例子中,它的abort_dll.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()
错误不再显示。