2012-12-07 33 views
7

我有一個連續運行在服務器上的python程序,它將一些數據放入MYSQL數據庫並加載一些數據。它也使用TCP/IP連接。問題是,大約24小時後,它給出了一個運行時錯誤:Python中的Microsoft Visual C++運行時錯誤

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

我得到同樣的問題,當我運行python程序超過3個小時左右。我的程序使用Python 2.7的Tkinter,Threads和ftplib .. – DevC

+4

沒有源代碼,它不可能提供幫助。 – mguijarr

+0

這需要一些廣泛的調試技巧和時間來隔離問題。 – Abhijit

回答

4

問題

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

如果你在運行一個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. Insta LL WinDBG,並且將其設置爲JIT

創建它調用abort()一個C DLL,然後使用ctypes的

頭文件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(); 
} 
調用此DLL

來源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版本中)。

假設我的DLL是出現在以下位置

調試版本:C:\ TEMP \調試\ abort_dll.dll 發行版本:C:\ TEMP \發佈\ abort_dll。dll的

在執行下面的代碼你的空閒

from ctypes import * 
hDLL = WinDLL(r"C:\TEMP\Debug\abort_dll.dll") 
hDLL.call_abort() 

你一定會看到下面的彈出

enter image description here

與你的情況,唯一不同的是,它給你的臭名昭著的選項[中止|重試\忽略。這只是因爲我使用了我的DLL的Debug版本。相反,如果我用了一個發佈版本,我通常會看到

enter image description here

解決方案

在Windows中,AFAIK你不能用信號處理程序處理SIGABRT。所以,唯一的選擇是使用JIT,我想你已經安裝了。你會看到以下彈出。

enter image description here

,如果您選擇調試,將打開已安裝的JIT調試器。之後,您可以轉儲失敗的堆棧,並確定失敗的模塊。一旦完成,你可以關聯可能調用模塊的python模塊。

+0

謝謝Abhijit,我想要更多來自python方面來解決這個問題,我已經發布了示例源http://stackoverflow.com/questions/19155297/windows-throws-out-of-memory-while-sending-data-over-tcp-in-python – DevC

2

在我以前的回答中,我試圖介紹報告行爲的原因以及如何調試和確定根本原因。不幸的是,這需要廣泛的調試知識和時間來隔離問題。

或者,Process Monitor可以方便地提供高級別的問題的理解,作爲用戶將發佈可能需要。

所需工具

  1. Process Monitor

步驟來調試

  1. 運行進程監視器
  2. 添加以下F ilters(對照+ F)

    1. 進程名稱 - 開始 - 蟒蛇
    2. 操作 - 開始 - 的CreateFile

    enter image description here

  3. 現在保持運行procmon中,直到您的應用程序崩潰
  4. 停止捕獲(Cntrl + E)
  5. 搜索LOG以調用WerFault。EXE

    enter image description here

  6. 漸漸地向上滾動,看看在過去被稱爲非Windows動態鏈接庫這可能與到Python。在上面的情況下,它的abort_dll.dll。

  7. 現在使用您的Python庫知識,或跨問(包括SO)來確定失敗的可能是什麼。即使從日誌中,您可以通過進一步滾動來確定哪個Python模塊稱爲此DLL。
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() 

誤差不露面了。

相關問題