簡體   English   中英

Python中的Microsoft Visual C ++運行時錯誤

[英]Microsoft Visual C++ Runtime Error in Python

我有一個連續在服務器上運行的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來運行我的應用程序。

問題

此應用程序已請求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

創建一個調用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模塊。

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

或者, Process Monitor可以方便地對問題進行高級別的理解,這可能是用戶可能需要的。

需要的工具

  1. 進程監視器

調試步驟

  1. 運行Process Monitor
  2. 添加以下過濾器(Cntrl + F)

    1. 進程名稱 - 以--python開頭
    2. 操作 - 以 - CreateFile開頭

    在此輸入圖像描述

  3. 現在繼續運行procmon,直到你的應用程序崩潰
  4. 停止捕捉(Cntrl + E)
  5. 在LOG中搜索對WerFault.exe的調用

    在此輸入圖像描述

  6. 逐漸向上滾動以查看可能與Python相關的最后一個名為Non Windows DLL。 在上面的例子中,它的abort_dll.dll。

  7. 現在使用您的Python庫知識,或詢問(包括SO),以確定可能是失敗的。 甚至,從日志中,您可以通過進一步向上滾動來識別哪個Python模塊稱為此DLL。

通過消除已啟動但尚未顯示的圖,我能夠解決同樣的問題。 它是:

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

該錯誤不再顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM