11. 6 调试技巧
1)一个不太为人所知却非常有效的技巧是在每个类中放一个main方法,这样就可以对每个类进行单元测试。这个方法可以保留,因为在java虚拟机只调用启动类的main方法。
2) 日志代理,( logging proxy) ,通过一个子类对象,窃取父类的方法调用,并在其中进行日志记录,示例代码如下:
Random random = new Random{
public double nextDouble(){
double result = nextDouble();
Logger.getGlobal().info("nextDouble:" + result);
return result;
}
}
3)利用Throwable的printStackTrace方法来打印调用堆栈;其实不一定要通过异常来打印堆栈信息,只要在代码的任何位置调用Thread.dumpStack()就可以打印当前的调用堆栈信息。
这样的信息一般显示在System.err中。
4)如何在文件中捕获输出流和错误流
捕获输出流
java MyProg >log.txt
捕获错误流
java MyProg 2>log.txt
同时捕获输出流和错误流
java MyProg >&log.txt
5)可以改变非默认的捕获异常的处理器
Thread.setDefaultUncaughtExceptionHandler{
new Thread.UncaughtExceptionHandler(){
public void uncaughtException(Thread t, Throwable e){
//save info to file
}
}
}
6)如果想要看到类的加载过程,可以调用 -verbose 标志启动java虚拟机,这样可以看到类似于如下的一些输出结果。
这种方法有助于诊断由于类路径引发的问题。
7)使用 java -Xlint:xxxx 来告诉编译器做某些语法检查。
8)有一个jconsole的程序可以用来监视java虚拟机的各种参数
jconsole 虚拟机进程id
9)可以使用jmap实用工具捕获一个堆的转储,其中显示了堆中的每一个对象,使用如下命令:
jmap -dump:format=b, file=dumpfilename processId
jhat dumpFileName
然后就可以使用浏览器进入 http://localhost:7000 来查看该转存对中对中的对象
10)如果使用 java -Xprof标志运行java虚拟机,就会运行一个基本的剖析器来分析那些在代码中经常被调用的方法。剖析信息将发送到 System.out 输出中。
11.8 使用调试器
这个基本会了,没啥好看的。