을 얻는 방법은 텍스트의 예외에 스택 추적 Java ME?
문제
일반 Java,당신이 얻을 수 있는 텍스트에 스택 추적 전달하여 PrintWriter 을 printStackTrace.나는 느낌이 나는 이미 답을 알고 있습니다(i.e"아니오")지만,
방법은 없을 구하의 텍스트에 스택 추적 JavaME 문자열로?
업데이트:
나도 언급해야한다는 제한 CLDC1.0
해결책
AFAIK 특정 플랫폼이 기본 시스템을 무시할 수있는 수단을 제공하지 않는 한 스택 추적을 문자열 값으로 가져올 방법이 없습니다. BlackBerry 플랫폼에서는 스택 추적을 쫓아냅니다. catch(Exception)
메모리를 저장하기 위해서는이 작업을 수행하지 않습니다. catch(Throwable)
장치 이벤트 로그를 통해 스택 추적에 액세스 할 수 있습니다.
내가 한 일은 마지막 순간에 예외보다는 던질 수있는 것을 잡아서 스택 추적을 인쇄하는 것입니다. 물론 이것은 당신이 잡을 위험이 있습니다. java.lang.Error
특히 그다지 좋지 않은 경우 OutOfMemoryError
, 전화를 받았지만 System.gc()
인쇄하기 전에 스택 추적은 위험을 줄이는 것처럼 보이며 우리는 그에 아무런 문제가 없었습니다.
나는 당신이 목표로하는 플랫폼을보고 그들이 System.err에 액세스 할 수 있는지 확인합니다. 당신은 항상 디버거를 연결할 수 있으며 콘솔 출력에 나타나야하지만 '필드에서'스택 추적을받은 후에 들립니다.
다른 팁
두 가지 솔루션 :
에뮬레이터의 예외를 재현하십시오. 무선 툴킷과 NetBeans는 컴퓨터에 스택 추적을 인쇄합니다.
Symbian 장치를 사용하십시오.
시리즈 60 3 판의 기능 팩 2 이전에 Symbian Handlets는 Sun Hotspot Java Virtual Machine을 사용합니다. C 표준 라이브러리의 부분 구현에 연결하여 Symbian OS에 적합했습니다.
이를 통해 Symbian은 Java Exception Stack Traces를 포함하여 VM 표준 출력 및 표준 오류를 캡처 할 수있는 Redipector라는 C ++ 프로그램을 만들 수있었습니다.
C ++ 리디렉터는 Symbian OS의 버전 9로 업그레이드되지 않았습니다. 대신, "redirect : //"GCF 프로토콜이 VM에 소개되었습니다.
별도의 미드렛에서 Connector.open ( "Redirect : //", Connector.Read)에서 반환 된 연결에서 입력 스트림을 열십시오. 그런 다음 Symbian 전화에서 예외 스택 추적을 캡처 할 수 있습니다.
편집 : "Redirect : //"는 Series60 5th Edition으로 돌아 왔고 "Redirect : // Test"는 Series60 3rd Edition Feature Pack 2에서 작동해야합니다.
CLDC 1.0에서는 그렇게 할 수있는 방법이 없습니다. 그러나 일부 장치/OS에서 기본 예외 클래스는 스택 추적에 액세스하는 방법을 제공 할 수 있습니다 (최신 CLDC 버전을 생각하십시오). 반사를 사용하여 런타임에서 예외 인스턴스를 검사하여 대상 플랫폼에서 어떤 멤버를 노출시키는 지 확인하십시오. 그런 다음 그러한 정보를 제공하는 플랫폼에서 스택 추적을 안전하게 추출 할 수있는 코드를 작성할 수 있습니다.
내가 생성할 수 있는 도구 사용을 로그에 적절한 스택 추적에서도 CLDC.에서 확인하십시오 http://jarrut.sourceforge.net.그것은 여전히 매우 새로고 그것은 몇 가지가있을 수 있습니다 거친 가장자리에,하지만 그것이 나를 위해 일하고 내가 상상할 수 없었 개발 MIDlets 없이 그것은 더 이상입니다.가장 좋은 방법을 사용하여 그것은 그것을 결합하 microlog.
Unfotunately 현재 도구가 필요합 CLDC1.1 지 않을 수도 있습니다 그래서 문제를 해결하는 원래 포스터입니다.
Printwriter가 BytearRayoutputStream에 쓰고 바이트에서 문자열을 재구성하도록 할 수 있습니다.
try{
throw new Exception("Message");
} catch (Exception ex){
ByteArrayOutputStream out = new ByteArrayOutputStream();
ex.printStackTrace(new PrintStream(out));
System.out.println(new String(out.toByteArray()));
}
예쁘지는 않지만 거의 모든 곳에서 작동해야합니다. 위의 시도를 시도하기 전에 [Throwable#GetStackTrace]에 액세스 할 수 없는지 확인하십시오.http://java.sun.com/j2se/1.4.2/docs/api/java/lang/throwable.html#getstacktrace ()), Eclipse는 CDC/Foundation 1.1에서 사용할 수 있다고 주장하지만 다른 프로파일에 대해서는 아무 말도하지 않습니다.