1、J2me 下利用 jarrut 打印异常堆栈一、J2me 下调试困境J2me 下打印异常信息,只能使用 printStatckTrace(), 只能输出到控制台上,没有提供输出到其他设备上的接口。这给 j2me 开发者带来很大不便,在模拟器上调试可以看看控制台的异常输出,在真机子上就没办法了获取异常信息了。还好,国外朋友提供了一个 jarrut 的工具,虽然作者的使用文档不够详细,使用起来有点复杂,但是如果用起来,对于在真机上定位问题还是很有帮助的,希望能帮到一些童鞋。项目网址为:http:/ jarrut 项目的作者。二、在工程中导入 jarrut-runtime-0.2.jar,有时需要导
2、入 microlog-logger-core-2.3.5.jar在你的项目中导入 jarrut-runtime-0.2.jar,该包主要定义了监听器接口、日志、堆栈结构等等,有兴趣的可以自己研究下。不要忘了勾选下面选项三、在工程中添加相应的代码在源代码例子中有相应的例子代码,我只列举其中一种1. MIDlet 继承 MethodTraceListener, ExceptionTraceListener 接口class MYMIDlet extends MIDlet implements CommandListener, MethodTraceListener, ExceptionTraceLi
3、stener, DontInstrument2. 在构造函数中设置方法、异常堆栈监听public MYMIDlet() TraceHandler.setExceptionTraceLevel(TraceHandler.TRACE_EXCEPTIONS_ALL);TraceHandler.setExceptionTraceListener(this);TraceHandler.setMethodTraceListener(this);3. 在方法、异常监听的回调函数中做相应处理public void methodEntered(StackTrace trace) public void meth
4、odExited(StackTrace trace) */public void methodExitedWithException(Throwable throwable, boolean uncaught, StackTrace trace) / System.out.println(throwable + “n“ + trace);/ if (uncaught) / System.err.println(“Uncaught exception “ + throwable + “.“);/ public void printExceptionStackTrace(Throwable thr
5、owable, StackTrace trace) /System.out.println(throwable + “n“ + trace);四、使用 jarrut-0.2.jar 对生成的类插入 jarrut 相应的代码利用 jarrut-0.2jar 主要的目的就是插入 jarrut 的调试代码。以下是我的项目中使用的批处理。Jarrut.bat 主要是对某一路径下的类进行 jarrut操作,生成一个临时目录存放经过 jarrut 操作后的类,并覆盖原来的类。jarrutdir.txt,主要存放需要进行 jarrut 操作的类的路径,每行一个路径。/call_jarrut.batfor /
6、f %i in (.jarrutdir.txt) do call jarrut %ipause/ jarrutdir.txtF:workspace HelloDemo bincomlogF:workspaceHelloDemobincom HelloDemo F:workspace HelloDemo binmeregexp/ jarrut.batsetlocal enabledelayedexpansionset rootdir=%1set oldcd=F: jarrut-0.2.20100706-binbinset tempdir=%rootdir%tempset errortxt=%te
7、mpdir%error.txtcd %rootdir%if exist %tempdir% rmdir %tempdir%if not exist %tempdir% mkdir %tempdir%if exist %errortxt% del /f /q %errortxt%for /f “usebackq“ %i in (dir /b *.class) do java -jar %oldcd%jarrut-0.2.jar -o %tempdir%i %rootdir%i & copy /y %tempdir%i %rootdir%i%errortxt%五、混淆时不要混合第三方包 jarrut-runtime-0.2.jar在混淆器的配置文件中添加如下语句,可以保持 jarrut-runtime-0.2.jar 不被 Proguard 混淆掉。将该包完整的导入到生成包中。-keep class net.sf.jarrut.runtime.*