2012-12-07 11 views
7

में माइक्रोसॉफ्ट विजुअल सी ++ रनटाइम त्रुटि मेरे पास एक पाइथन प्रोग्राम है जो लगातार सर्वर में चलता है और यह कुछ डेटा MYSQL डेटाबेस में रखता है और कुछ लोड करता है। यह टीसीपी/आईपी कनेक्शन का भी उपयोग कर रहा है। समस्या यह है कि लगभग 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. 

और मैंने ठीक पायथन शेल बंद कर दिया। और जब मैं सभी पायथन फ़ाइलों को बंद करता हूं और विंडोज टास्क मैनेजर की जांच करता हूं तो मुझे लगता है कि वहाँ एक pythonw.exe फ़ाइल खुलती है !!!

मैं अपना आवेदन चलाने के लिए आईडीएलई का उपयोग कर रहा हूं।

+0

मुझे एक ही समस्या मिल रही है, जब मैं पाइथन प्रोग्राम को 3 घंटे से अधिक समय तक चलाता हूं। मेरा प्रोग्राम टिथर, थ्रेड और फीटप्लिब का उपयोग पायथन 2.7 .. – DevC

+4

स्रोत कोड के बिना, मदद करना संभव नहीं है। – mguijarr

+0

इस मुद्दे को अलग करने के लिए कुछ व्यापक डिबगिंग कौशल और समय की आवश्यकता होगी। – Abhijit

उत्तर

4

समस्या

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

क्या तुमने कभी एक खिड़कियों आवेदन चलाते समय यह त्रुटि मिलती है, यह सबसे संभवत: आपके अजगर पुस्तकालय में कहीं, और यहां तक ​​कि अपने अजगर क्रम से संभव हो, abort() दिनचर्या बुलाया गया था है। अधिक जानकारी के लिए, और बुला abort देखें MSDN documentation on abort

डेमो के व्यवहार के लिए

आप

  1. Visual Studio 2008 (Express Edition)
  2. _SYM_PATH में सही ढंग से Microsoft Symbol Server स्थापना
  3. अजगर 2.7
  4. की आवश्यकता होगी
  5. इंस्टा ll WinDBG, और यह सेट के रूप में JIT

ऊपर एक सी DLL जो abort() कॉल बनाएं और फिर 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; 
} 

अब अपना डीएलएल संकलित करें और बनाएं (डीबग और रिलीज संस्करण दोनों में)।

मान लिया जाये कि मेरी DLLs निम्न स्थान

डीबग संस्करण में मौजूद हैं: C: \ TEMP \ डीबग \ abort_dll.dll रिलीज संस्करण: सी: \ TEMP \ रिलीज \ abort_dll।dll

में निम्न कोड निष्पादित अपने निष्क्रिय

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

आप निम्न पॉपअप

को देखने के लिए सुनिश्चित हैं

enter image description here

अपने मामले के साथ फर्क सिर्फ इतना है, यह आप कुख्यात विकल्प देता है [बीच में बंद करें | पुन: प्रयास करें \ पर ध्यान न दें]। यह केवल इसलिए था क्योंकि मैंने अपने डीएलएल का डीबग संस्करण इस्तेमाल किया था। इसके बजाय, अगर मैं एक रिलीज़ संस्करण का इस्तेमाल किया था, मैं आम तौर पर

enter image description here

समाधान

देखना होगा Windows में, AFAIK आप एक संकेत हैंडलर के साथ SIGABRT को संभाल नहीं कर सकते हैं। इसलिए, एकमात्र शर्त जेआईटी का उपयोग करना है, मुझे लगता है कि आप पहले से ही स्थापित कर चुके हैं। फिर आप निम्नलिखित पॉप अप देखेंगे।

enter image description here

आप डीबग का चयन करेंगे, तो वह अपने स्थापित JIT डिबगर खुल जाएगा। इसके बाद, आप असफल स्टैक को डंप कर सकते हैं, और असफल मॉड्यूल निर्धारित कर सकते हैं। एक बार पूरा हो जाने पर, आप फिर से संबंधित पाइथन मॉड्यूल क्या कर सकते हैं जो मॉड्यूल कहला सकता है।

+0

धन्यवाद अभिजीत, मैं चाहता था इसे समझने के लिए पाइथन पक्ष से अधिक, मैंने उदाहरण स्रोत पोस्ट किया है http://stackoverflow.com/questions/19155297/windows-thows-out-of-memory-while-sending-data-over-tcp-in-python – DevC

2

मेरे पूर्व उत्तर में, मैंने रिपोर्ट किए गए व्यवहार के कारण और मूल कारण को डीबग और निर्धारित करने का कारण बताया। दुर्भाग्य से, इस समस्या को अलग करने के लिए एक व्यापक डीबगिंग ज्ञान और समय की आवश्यकता है।

वैकल्पिक रूप से, Process Monitor समस्या की उच्च स्तर की समझ देने के लिए कुछ आसान हो सकता है, जिसे उपयोगकर्ता संभवतः पोस्ट करने की आवश्यकता होगी।

उपकरण डीबग करने के लिए आवश्यक

  1. Process Monitor

कदम

  1. रन प्रक्रिया की निगरानी
  2. निम्नलिखित च जोड़े ilters (Cntrl + F)

    1. प्रक्रिया नाम - अजगर
    2. ऑपरेशन - - साथ शुरू होता है के साथ शुरू होता - CreateFile

    enter image description here

  3. अब procmon चालू रखने, जब तक आपके आवेदन
  4. क्रैश
  5. कैप्चर रोकें (Cntrl + E)
  6. WerFault पर कॉल के लिए LOG खोजें।exe

    enter image description here

  7. धीरे धीरे पिछले गैर विंडोज DLL जो अजगर से संबंधित हो सकता बुलाया देखने के लिए ऊपर स्क्रॉल करें। उपरोक्त मामले में, its abort_dll.dll।

  8. अब अपने पायथन लाइब्रेरी ज्ञान का उपयोग करें, या यह निर्धारित करने के लिए, एसओ सहित) पूछें, असफल हो सकता है। यहां तक ​​कि, लॉग से, आप पहचान सकते हैं, जो पाइथन मॉड्यूल ने आगे बढ़कर इस डीएलएल को बुलाया था।
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() 

त्रुटि अब और दिखाई नहीं देता।

संबंधित मुद्दे