java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧

时间:2024-01-10 23:22:38

11. 6 调试技巧

1)一个不太为人所知却非常有效的技巧是在每个类中放一个main方法,这样就可以对每个类进行单元测试。这个方法可以保留,因为在java虚拟机只调用启动类的main方法。
2)   日志代理,( logging proxy) ,通过一个子类对象,窃取父类的方法调用,并在其中进行日志记录,示例代码如下:
  1. Random random = new Random{
  2. public double nextDouble(){
  3. double result = nextDouble();
  4. Logger.getGlobal().info("nextDouble:" + result);
  5. return result;
  6. }
  7. }
3)利用Throwable的printStackTrace方法来打印调用堆栈;其实不一定要通过异常来打印堆栈信息,只要在代码的任何位置调用Thread.dumpStack()就可以打印当前的调用堆栈信息。
    这样的信息一般显示在System.err中。
4)如何在文件中捕获输出流和错误流
  1. 捕获输出流
  2. java MyProg >log.txt
  3. 捕获错误流
  4. java MyProg 2>log.txt
  5. 同时捕获输出流和错误流
  6. java MyProg >&log.txt
5)可以改变非默认的捕获异常的处理器
  1. Thread.setDefaultUncaughtExceptionHandler{
  2. new Thread.UncaughtExceptionHandler(){
  3. public void uncaughtException(Thread t, Throwable e){
  4. //save info to file
  5. }
  6. }
  7. }
6)如果想要看到类的加载过程,可以调用 -verbose 标志启动java虚拟机,这样可以看到类似于如下的一些输出结果。
这种方法有助于诊断由于类路径引发的问题。
java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧
java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧


7)使用 java -Xlint:xxxx 来告诉编译器做某些语法检查。
    java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧
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 使用调试器
    这个基本会了,没啥好看的。