java 调试技巧

【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java 调试技巧 的相关知识;


【1】调试技巧相关

1.1)可以用下面的方法打印或记录任意变量的值:

System.out.println("x= " + x);
或
Logger.getGlobal().info("x=" + x);

1.2)在每一个类中放置一个main方法进行单元测试;
1.3)JUnit 是一个非常常见的单元测试框架;
1.4)日志代理: 日志代理是一个子类对象, 它可以窃取方法调用, 并进行日志记录, 然后调用超类中的方法;

  • 1.4.1)看个荔枝: 如果在调用一个面板的 setBackground 方法时 出现了问题, 就可以按照下面的方式, 以匿名子类的形式创建一个代理对象:
Random generator = new Random() 
    {
        public double getDouble()
        {
            double result = super.nextDouble();
            Logger.getGlobal().info("nextDouble" + result);
            return result;        
        }
    }
  • 当调用nextDouble 方法时, 就会产生一个日志消息。 要想知道谁调用了这个方法, 就要生成一个 堆栈跟踪;

1.5)利用 Throwable 类提供的 printStackTrace 方法,可以从任何一个异常对象中获得堆栈情况。

  • 1.5.1)看个荔枝: 下面 的代码将捕获任何异常, 打印异常对象和堆栈跟踪, 然后,重新抛出异常, 以便能够找到相应的处理器;
try
{}
catch(Throwable t)
{
    t.printStackTrace();
       throw t;
}
  • 1.5.2)不一定要通过捕获异常来生成堆栈跟踪, 只要在代码的任何位置插入下面这条语句就可以获得堆栈跟踪:Thread.dumpStack();

1.6)堆栈跟踪显示在 System.err 上。 也可以利用 printStackTrace(PrintWriter s) 方法将它发送到一个文件中。另外, 如果想要记录或显示堆栈跟踪, 就可以采用下面的方式, 将它捕获到一个字符串中;

ByteArrayOutputStream out = new ByteArrayOutputStream();
new Throwable().printStackTrace();
String description = out.toString();

1.7)要知道,错误信息被发送到 System.err 而不是 System.out 中, 所以, 不能够通过下列语句获取他们:

java MyProgram > errors.txt
  • 1.7.1)而是采用下面方式捕获错误流:
java MyProgram 2> errors.txt
  • 1.7.2)要想在同一个文件中同时捕获 System.err 和 System.out , 需要使用下面这条命令:
java MyProgram >& errors.txt

1.8)让非捕获异常的堆栈跟踪出现在System.err 中并不是一个很好的想法。 比较好的方法是将这些内容记录到一个文件中。 可以调用静态的 Thread.setDefaultUncaughtExceptionHandler 方法改变非捕获异常的处理器;

Thread.setDefaultUncaughtExceptionHandler
(
     new Thread.UnCaughtExceptionHandler()
    {
        public void uncaughtException(Thread t, Throwable e)
        {
            save info in log file
        }
    }  
);

1.9)要想观察类的加载过程, 可以使用 -verbose 标志启动 java 虚拟机, 看到如下输出结果:(有时候, 这种方法有助于诊断由于类路径引发的问题)

1.10)Xlint 选项告诉编译器对一些普遍容易出现的代码问题进行检查。如, 使用下面这条命令编译:

javac -Xlint: fallthrough
  • 当switch 语句中缺少break 语句时, 编译器会给出报告, 下面列出了可以使用的选项:

1.11)jvm 增加了对 java应用程序进行监控和管理的支持; 它允许利用jvm 中的代理装置跟踪内存消耗, 线程使用, 类加载等情况;
1.12)可以使用 jmap 实用工具获得一个堆的转储, 其中显示了堆中的每一个对象,使用命令如下:

jmap -dump:format=b, file=dumpFileNmae processID
jhat dumpFileName

然后, 通过浏览器进入 localhost:7000, 将会运行一个网络应用程序, 借此探查存储对象时堆的内容;
1.13)如果使用 -Xprof 标志运行 jvm , 就会运行一个基本的剖析器来跟踪那些代码中经常被调用的方法。 剖析信息将发送给 System.out, 输出结果还会显示哪些方法是由 即时编译器编译的;

Warning)编译器的 -X 选项并没有被正式支持, 而且在有些 JDK 版本中并不存在这个选项。 可以运行命令java -X 得到所有非标准选项的列表;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值