我试图使用仪器调试 java 应用程序。当前系统的问题是
- 几乎没有写任何日志语句
- 异常处理不佳
这使得很难追踪功能损坏的根本原因。
为了处理这种情况,我开发了工具,使用Instrumentation
API 的 java 代理,我能够注入日志语句并解决了一半的问题。
但下一个问题是记录异常。我想扩展我的工具记录应用程序执行期间抛出的每个异常。我尝试使用javaassist
方法的API(使用addCatch
,insertBefore
和insertAfter
)注入'try-catch'块,它在一定程度上是有效的。
public byte[] transform(ClassLoader loader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer)
throws IllegalClassFormatException {
if (className.startsWith("com/alu/")) {
return insertLog(className, classBeingRedefined, classfileBuffer);
}
if(className.endsWith("Exception")){
System.out.println("============= exception occured "+className);
}
这里 inserLog(..)
方法将注入必要的日志语句并且工作正常,但是当有任何异常时它不会出现在转换器中。
但问题是某些方法在内部处理异常(即使没有日志/系统输出)。
例如:
try {
if(search.equals("Category")){
//do operation
}
} catch (Exception e) {
}
NullPointerException
当值为null 时,此代码会吃掉search
,我从不知道此异常并且应用程序因其他原因而失败。
最终我想要的是一种记录应用程序抛出的任何异常的机制。以下细节将被捕获
- 异常类型
- 异常堆栈跟踪
- 方法和类名
我知道有 API Thread.setDefaultUncaughtExceptionHandler
,但不确定它如何与 java 工具一起使用。我没有任何源访问该应用程序。
[更新1]
我发现下面的链接告诉使用retransformation
,我会尝试更新
任何指导都会非常有帮助。