关于解Bug的总结

发表于:2012-2-28 10:48

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:hitlion2008    来源:51Testing软件测试网采编

  3、空指针异常NullPointerException

  背景:

  在C/C++/Java中空指针异常是比较常见的一类导致程序崩溃的原因。在C/C++/Java中,如果使用的指针或对象没有正确的初始化,则很容易发生NullPointerException。

  问题:

  当发生NullPointerException的时候,程序通常会因异常而崩溃的。但通常都会打印出运行时的堆栈信息。

  分析:

  从程序的堆栈信息,会很容易的看到发生问题的代码位置,这样就可以找到直接原因。但是这找到问题的一小部分,具体是什么导致对象为空,这就不是那么容易调查出原因了。

  解决方案:

  对于这类问题,一开始能想到的办法就是加上对空指针的检测,如果指针或对象为空的话就不对其进行操作。但这是行不通的,这也不是正确的解决方法,最直接的问题就是,当指针为空的时候应该去做什么。如果在一个类中,在其他地方引用的时候都做了空指针检测,而这个地方没有做,那么可以仿照其他地方那样,加上空指针检测。但假如不是这样的情况,就要好好的调查一下指针为什么会是空,而非处理空指针。但这通常都是比较困难的,因为要去追踪对象是从哪里来的,又在哪里被修改和引用,是在哪里初始化的。只有找到了真正让对象为空的原因,才能算是比较完整的解决了问题。但如果一个比较复杂的系统,引用的地方很多,且假如又涉及到多线程时,则追踪起来会更加的困难。

  教训:

  对于空指针问题,不能简单的加上一个条件。要进一步的深入去调查是什么导致了指针为空。除非,你有充足的理由去加上条件。

  4、无解的问题

  案例一:

  背景:

  有些问题是极及诡异的,而且出现的机率非常的小,但它们还是会出现,但是找不到合适的解决方案。

  问题:

  在一个GUI系统中,在一个比较基础的类里面报出了一个NullPointerException。由于这个类会被很所有涉及GUI的应用程序所使用。

  分析:

  根据程序退出时打印出来的堆栈信息,找到了发生异常的代码位置。令人感到惊讶的是,这一行是绝不可能发生空指针的,因为它用的都是基本数据类型。上下几十行之内也是绝不可能发生NullPointer的。

  解决方案:

  这个问题,始终没有找到解决方案。

  案例二:

  背景:

  对一个系统做大规模的随机压力测试。一个对象的类Message是一个final的类,且其重载了toString()方法,它会按如下格式打印信息:"{ what=XXX when=XXX XXXXXX }"

  问题:

  在一次测试过程中,系统核心进程因异常退出,导致系统自动重启。

  分析:

  问题的原因是在核心进程中发生了一个RuntimeException,并有一条消息:"[c0x44bc: This message is already in use."。从堆栈找到退出的位置的代码,发现它是程序检测到不合理的操作然后抛出的一个RuntimeException:代码如下:

// ...
if (msg.when != 0) {
throw new RuntimeException(msg + " This message is already in use.");
}
// ...

  这里的msg是一个Message的对象。

  通常来讲+会调用对象的toString()方法,而toString()方法的输出又有特定的格式,所以,这里就发生了让人极其迷惑的事情。因为最终打印出来的消息跟对象的toString()有很大的差别。从日志信息来看,当前对象应该是一个char数组,而并非一个Message对象,但是在相关的上下文都无法找到这样一个char数组。

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号