2011-12-14 6 views
10

मैं सोच रहा था कि एक जावा प्रोग्राम "अंदर" से विंडोज त्रुटि रिपोर्टिंग का उपयोग करने का कोई तरीका था या नहीं?गैर-घातक जावा समस्याओं के लिए "विंडोज त्रुटि रिपोर्टिंग" का उपयोग किया जा सकता है?

दूसरे शब्दों में, वास्तविक JVM क्रैश के बिना अपवादों को केंद्रीय स्थान पर वापस रिपोर्ट करने के लिए तंत्र का उपयोग करें (जो मेरी समझ के लिए यह पहली जगह में ट्रिगर करता है)।

यहां विचार विंडोज उपयोगकर्ताओं से बग रिपोर्ट एकत्र करना आसान बनाना है।


मैं यह भी सुनना चाहूंगा कि यह नियंत्रित शट डाउन का हिस्सा हो सकता है। अर्थात। एक JVM क्रैश नहीं बल्कि जावा प्रोग्राम से सामान्य, नियंत्रित निकास नहीं है।


यह सोच से अधिक के बाद, मुझे लगता है कि यह पर्याप्त होना हमारे उद्देश्यों एक के हमारे हिस्से के अंदर स्थित एक छोटे से विंडोज़ अनुप्रयोग के लिए पाठ फ़ाइलों का सेट (या शायद सिर्फ एक पाठ धारा में पाइप) बनाने के लिए चाहते हैं फाइल सिस्टम विंडोज़ एप्लिकेशन ने कहा तो फिर प्रमुख रूप से दुर्घटनाग्रस्त हो जाता है और हमारे द्वारा प्रदान किए गए पाठ सहित एक रिपोर्ट भेजी जाती है। क्या इससे काम हो जायेगा?

+0

[NTEventLogAppender] (http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/nt/NTEventLogAppender.html) या जैसा? संपादित करें: [संभावित रूप से संबंधित प्रश्न] (http://stackoverflow.com/questions/164879/how-to-write-from-java-to-the-windows-event-log) –

+0

@VineetReynolds, क्या यह "भेजें" को ट्रिगर करेगा माइक्रोसॉफ्ट के लिए बग रिपोर्ट "कार्रवाई? –

+0

[नहीं। यह केवल एक क्रैश पर होने के लिए कॉन्फ़िगर किया गया है।] (Http://support.microsoft.com/kb/310414) –

उत्तर

4

आप मूल WER लाइब्रेरी फ़ंक्शंस के साथ इंटरऑप कर सकते हैं।

यहाँ प्रासंगिक MSDN प्रलेखीकरण है:

  1. Creating a report
  2. Submitting a report

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

संपादित करें:

मैं कुछ और अधिक शोध किया है, और मुझे लगता है कि आप जावा बाइंडिंग उत्पन्न करने के लिए GlueGen या SWIG उपयोग करने का प्रयास कर सकता है। यदि आप बाइंडिंग जेनरेट करना चाहते हैं तो आपको werapi हेडर फ़ाइल प्राप्त करने के लिए download the Windows SDK करना होगा।

+0

यदि आप चाहें तो आप थ्रेड-वाइड UncaughtExceptionHandler में काम कर सकते हैं: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.UncaughtExceptionHandler.html। लेकिन यह शायद एक अच्छा अभ्यास नहीं है। –

6

मुझे जावा और .NET के बीच अंतःक्रियाशीलता प्रोग्राम करना पड़ा था, इसलिए मैंने WER के साथ बातचीत करने के लिए .NET का उपयोग करने के लिए कुछ शोध करना शुरू किया ताकि यह देखने के इरादे से WER में बातचीत करना संभव हो एक .NET ऐप जिसे आप जावा के साथ इंटरफ़ेस कर सकते हैं। दिलचस्प बात यह है कि, मैं इस पोस्ट में एसओएफ - Is there a .Net API for Windows Error Reporting

पर इस पोस्ट में आया था, उस पोस्ट में WER के साथ बातचीत करने से संबंधित कुछ अच्छी जानकारी है।

मुझे पता है कि पोस्ट WER के खिलाफ .NET का उपयोग करके घूमती है, लेकिन जैसा कि आप मूल विंडोज कार्यक्षमता के साथ बातचीत करने की कोशिश कर रहे हैं, मैं इसके साथ बातचीत करने के लिए .NET का उपयोग करने की अनुशंसा करता हूं क्योंकि यह देशी विंडोज संसाधनों के साथ बातचीत करना इतना आसान है जावा के साथ .NET का उपयोग करना (और यह आमतौर पर जावा में आधा कोड लेता है)। इसके बाद आप जावा के साथ .NET ऐप (विंडोज सेवा के रूप में सबसे अच्छी तरह से स्थापित हो सकते हैं) के लिए इंटरफ़ेस कर सकते हैं (उदाहरण के लिए, आप .NET ऐप में अस्थायी "ट्रिगर" फ़ाइलों का उपयोग कर सकते हैं यह इंगित करने के लिए कि .NET ऐप इसके साथ कब किया जाता है प्रसंस्करण; जावा ऐप तब जांच कर सकता है कि जब "ट्रिगर" फ़ाइल बनाई गई है और वहां से जारी है ...)।

जैसा कि उस पोस्ट में स्वीकृत उत्तर की सिफारिश की जाती है, हालांकि, WER के साथ बातचीत करने के लिए कुछ प्रोग्रामिंग के बजाय विंडोज गुणवत्ता ऑनलाइन सेवाओं का उपयोग करना सबसे अच्छा हो सकता है क्योंकि ऐसा लगता है कि WER अन्य अनुप्रयोगों द्वारा उपयोग नहीं किया जाना है।

+0

सुनिश्चित नहीं है कि कोई भी इसका कभी जवाब देगा, लेकिन यह जानना उपयोगी होगा कि यह प्रतिक्रिया क्यों कम हो गई - धन्यवाद। –

10

आप निश्चित रूप से Windows त्रुटि रिपोर्टिंग API का उपयोग कर सकते हैं जो Win32 API के हिस्से के रूप में wer.dll में जहाजों का उपयोग करता है।

जावा से डीएलएल-आधारित कार्यों को कॉल करने का सबसे अच्छा तरीका सक्रिय रूप से विकसित Java Native Access project का उपयोग कर रहा है। ,

typedef struct _WER_REPORT_INFORMATION { 
    DWORD dwSize; 
    HANDLE hProcess; 
    WCHAR wzConsentKey[64]; 
    WCHAR wzFriendlyEventName[128]; 
    WCHAR wzApplicationName[128]; 
    WCHAR wzApplicationPath[MAX_PATH]; 
    WCHAR wzDescription[512]; 
    HWND hwndParent; 
} WER_REPORT_INFORMATION, *PWER_REPORT_INFORMATION; 

ऐसा करने के लिए:

आदेश आवश्यक Win32 API कॉल करने के लिए, हम कम से कम इन कार्यों के बारे में JNA सिखाने के लिए की आवश्यकता होगी:

HRESULT WINAPI WerReportCreate(
    __in  PCWSTR pwzEventType, 
    __in  WER_REPORT_TYPE repType, 
    __in_opt PWER_REPORT_INFORMATION pReportInformation, 
    __out  HREPORT *phReportHandle 
); 

HRESULT WINAPI WerReportSubmit(
    __in  HREPORT hReportHandle, 
    __in  WER_CONSENT consent, 
    __in  DWORD dwFlags, 
    __out_opt PWER_SUBMIT_RESULT pSubmitResult 
); 

है और यह भी इस struct हम WER.java पैदा हो जाएगी:

package com.sun.jna.platform.win32; 

import com.sun.jna.Native; 
import com.sun.jna.Pointer; 
import com.sun.jna.platform.win32.WinDef.HWND; 
import com.sun.jna.platform.win32.WinNT.HANDLE; 
import com.sun.jna.platform.win32.WinNT.HRESULT; 
import com.sun.jna.ptr.PointerByReference; 
import com.sun.jna.win32.StdCallLibrary; 
import com.sun.jna.win32.W32APIOptions; 

public interface Wer extends StdCallLibrary { 
    Wer INSTANCE = (Wer) Native.loadLibrary("wer", Wer.class, 
               W32APIOptions.DEFAULT_OPTIONS); 

    public static class HREPORT extends HANDLE { 
     public HREPORT() { } 
     public HREPORT(Pointer p) { super(p); } 
     public HREPORT(int value) { super(new Pointer(value)); } 
    } 

    public static class HREPORTByReference extends ByReference { 
     public HREPORTByReference() { 
      this(null); 
     } 

     public HREPORTByReference(HREPORT h) { 
      super(Pointer.SIZE); 
      setValue(h); 
     } 

     public void setValue(HREPORT h) { 
      getPointer().setPointer(0, h != null ? h.getPointer() : null); 
     } 

     public HREPORT getValue() { 
      Pointer p = getPointer().getPointer(0); 
      if (p == null) 
       return null; 
      if (WinBase.INVALID_HANDLE_VALUE.getPointer().equals(p)) 
       return (HKEY) WinBase.INVALID_HANDLE_VALUE; 
      HREPORT h = new HREPORT(); 
      h.setPointer(p); 
      return h; 
     } 
    } 

    public class WER_REPORT_INFORMATION extends Structure { 
     public DWORD dwSize; 
     public HANDLE hProcess; 
     public char[] wzConsentKey = new char[64]; 
     public char[] wzFriendlyEventName = new char[128]; 
     public char[] wzApplicationName = new char[MAX_PATH]; 
     public char[] wzDescription = new char[512]; 
     public HWND hwndParent; 

     dwSize = new DWORD(size()); 
    } 

    public abstract class WER_REPORT_TYPE { 
     public static final int WerReportNonCritical = 0; 
     public static final int WerReportCritical = 1; 
     public static final int WerReportApplicationCrash = 2; 
     public static final int WerReportApplicationHang = 3; 
     public static final int WerReportKernel = 4; 
     public static final int WerReportInvalid = 5; 
    } 

    HRESULT WerReportCreate(String pwzEventType, int repType, WER_REPORT_INFORMATION pReportInformation, HREPORTByReference phReportHandle); 
    HRESULT WerReportSubmit(HREPORT hReportHandle, int consent, DWORD dwFlags, WER_SUBMIT_RESULT.ByReference pSubmitResult); 
} 

मैं बस कुछ ही मिनट में एक साथ कि खटखटाया MSDN dcoumentation से एस - अगर यह अपूर्ण है, या गलत है, तो tons of examples और pretty good documentation जेएनए वेबसाइट पर हैं।

जेएनए चलाने के लिए, आपको jna.jar और platform.jar की आवश्यकता होगी, जिसे आप जेएनए वेबसाइट से भी ले सकते हैं।

0

क्या आप कहने का मतलब है कि hs_err_pid * .log फ़ाइलों को बनाने के बजाय WER को इसके साथ लॉग लॉग करना चाहिए ?? या आप किसी भी अपवाद के विस्तृत अपवाद संदेश को लॉग इन करना चाहते हैं जिसे WER में जावा प्रोग्राम में संभाला जा सकता है?

यदि मामला 1 है तो स्पष्ट रूप से आप इसे अच्छी तरह से नहीं कर सकते हैं। आपके पास hs_err_pid * .log बनाया गया-> बाहरी पुस्तकालयों का उपयोग करके इसकी व्याख्या करने के लिए हर समय एक अलग डिमन चल रहा हो सकता है-> WER रिकॉर्ड्स में इसे लिखने के लिए ऊपर सुझाए गए WER API का उपयोग करें।

यदि मामला दूसरा है तो आप जेएनआई कॉल करना चाहेंगे और WER में सामान लिखने के लिए WER API को कॉल कर सकते हैं।