单步调试代码进行调试可能并不总是合情合理的,例如并发问题。将所有必要的东西记录到文件或数据库并在实际发生问题时分析数据对我来说似乎更有用。当然,这可以从方法本身内部完成,但它会很混乱:
public int square(int value) {
return value * value;
}
VS
public int square (int value){
output.begin(this, "square", value);
try {
int result = value * value;
output.end(this, "square", value);
return result;
} catch(RuntimeException e) {
output.throwz(this, "square", e);
throw e;
}
}
使用现有的大型代码库不可能(就工作时间而言)。有没有办法从我的程序中附加代码以在方法调用上执行或返回执行类似的操作?
/* !! This is pseudo code, not Java !! */
Runtime.getRuntime().setMethodBeginListener(new MethodBeginListener() {
@Override
public void onMethodBegin(Thread t, Object o, Method m, Object[] args) {
// log it
}
});
Runtime.getRuntime().setMethodEndListener(new MethodEndListener() {
@Override
public Object onMethodEnd(Thread t, Object o, Method m, Object returnValue) {
// log it
return o;
}
});
Runtime.getRuntime().setMethodThrowsListener(new MethodThrowsListener() {
@Override
public Object onMethodThrows(Thread t, Object o, Method m, Throwable t) {
// log it
throw t;
}
});
(如果该方法将由同一个线程执行,Thread
参数将会过时。)我知道这会产生额外的工作量,所以就这样吧。我知道有其他编程语言,如AspectJ,为此提供更好的,但我正在寻找一种方式在Java(准确地说是Web应用程序)使用调试器,这样我就可以添加一个按钮“保存调试日志“在我的应用程序中,在运行时启用此行为。