2011-12-14 2 views
10

Java 프로그램의 "내부"에서 Windows 오류보고를 사용하는 방법이 있는지 궁금합니다.치명적이지 않은 Java 문제에 "Windows 오류보고"를 사용할 수 있습니까?

즉, 메커니즘을 사용하여 실제 JVM 크래시가 발생하지 않고 중앙 위치로 예외를보고합니다.이 사실을 이해하면 처음부터 트리거됩니다.

여기에있는 아이디어는 Windows 사용자가 버그 보고서를보다 쉽게 ​​수집 할 수 있도록하기위한 것입니다.


조절 된 시스템 종료의 일부일 수도 있습니다. 나는. JVM 충돌이 아니라 Java 프로그램에서 정상적으로 제어되는 종료.


을 통해 생각 후, 나는 우리의 목적은 우리의 부분 안쪽에 작은 Windows 응용 프로그램에 텍스트 파일의 집합 (또는 단일 텍스트 스트림에서 아마 단지 파이프)를 생성하는 것이 충분하다고 생각 파일 시스템. 그러면 Windows 응용 프로그램이 눈에 띄게 손상되고 Google에서 제공 한 텍스트를 포함하여 보고서가 전송됩니다. 그게 효과가 있니?

+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, "보내기 Microsoft에 버그 리포트 "조치? –

+0

[Nope. 이는 충돌시에만 발생하도록 구성됩니다.] (http://support.microsoft.com/kb/310414) –

답변

4

네이티브 WER 라이브러리 기능과 상호 운용 할 수 있습니다. 여기

은 관련 MSDN 문서입니다 : 코드 예제를 제공 할 수 있습니다 더 자바 상호 운용성 경험

  1. Creating a report
  2. Submitting a report

아마도 누군가, 나는 더 해요. NET 남자가 불행하게도.

편집 :

는 좀 더 많은 연구를했고, 난 당신이 자바 바인딩을 생성하는 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

과거에 Java와 .NET 사이의 상호 운용성을 프로그래밍해야했기 때문에 .NET을 사용하여 WER과 상호 작용하여 WER과 상호 작용할 수 있는지 알아보기위한 연구를 시작했습니다. Java와 인터페이스 할 수있는 .NET 응용 프로그램. 흥미롭게도, 나는 SOF에이 게시물을 건너 왔어요 - Is there a .Net API for Windows Error Reporting

그 게시물은 WER와의 상호 작용과 관련된 좋은 정보를 가지고 있습니다.

WER에 대해. NET을 사용하여 게시물을 처리하지만 네이티브 Windows 기능과 상호 작용하려고 할 때 네이티브 Windows 리소스와 상호 작용하기가 훨씬 쉽기 때문에 .NET을 사용하여 상호 작용하는 것이 좋습니다. Java를 사용하는 것보다 .NET을 사용합니다 (Java에서는 일반적으로 절반의 코드 만 차지합니다). 그런 다음 Java를 사용하여 .NET 응용 프로그램 (Windows 서비스로 설정하는 것이 가장 좋음)에 인터페이스 할 수 있습니다 (예 : .NET 응용 프로그램에서 임시 "트리거"파일을 사용하여 .NET 응용 프로그램이 완료된 시점을 나타낼 수 있음). 자바 애플 리케이션은 그 때 "트리거"파일이 생성되고 거기에서 계속하는 것을 볼 수 있습니다.

WER가 다른 응용 프로그램에서 사용하기위한 것이 아니기 때문에 WER와 상호 작용하도록 프로그래밍하는 대신 Windows Quality Online Services를 사용하는 것이 가장 좋습니다.

+0

누구나 답변을 해줄 지 확신 할 수 없지만이 응답이 왜 실패했는지 알면 도움이 될 것입니다. 감사합니다. –

10

wer.dll에 포함 된 Windows 오류보고 API를 Win32 API의 일부로 사용할 수 있습니다.

Java에서 DLL 기반 함수를 호출하는 가장 좋은 방법은 적극적으로 개발 된 Java Native Access project을 사용하는 것입니다. 필요한 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 
); 

하고이 구조체 :

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; 

이 작업을 수행하기를, 우리는 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에서 함께 그 노크 s - 불완전하거나 올바르지 않은 경우 JNA 웹 사이트에 tons of examplespretty good documentation이 있습니다.

JNA를 실행하려면 jna.jarplatform.jar이 필요하며 JNA 웹 사이트에서 가져올 수도 있습니다.

0

hs_err_pid * .log 파일을 만드는 대신 WER에서 로그를 기록해야합니까 ?? 아니면 WER의 Java 프로그램에서 처리 할 수있는 예외에 대한 자세한 예외 메시지를 기록 하시겠습니까?

케이스가 1이면 분명히 깔끔하게 처리 할 수 ​​없습니다. hs_err_pid * .log created -> 외부 라이브러리를 사용하여 해석 -> 위에서 언급 한 WER API를 사용하여 WER recorords에 기록하는 데몬을 항상 가지고있을 수 있습니다.

두 번째 사례 인 경우 JNI 전화를 걸고 WER API에 전화를 걸어 WER에 물건을 쓸 수 있습니다.