`

一次BUG定位的过程与总结

阅读更多
当前,现场运行的版本是B110,B110是5月24日发出去的。与B110同步拉了一个B111分支,用来定位B110的问题,并出补丁

今天现场发回了一个BUG,定位出来是ClassA出的问题,由于ClassA是个很少会改动的类,头脑一时发晕,就直接在主干上修改,出了补丁发到现场

结果这个问题解决了,却引入了一个新问题。有一段代码一直进不去,异常如下:

Caused by: java.lang.NoSuchMethodError: com.xxx.service.EndVerifyService.execute(Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;)Lnet/sf/json/JSONObject;
at cz.xxx.services.inbound_webservices_tickets.v1_0.saservice.InboundWebServicesTicketSaServiceSoapImpl.ttEndVerifyService(InboundWebServicesTicketSaServiceSoapImpl.java:135)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:166)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:82)

定位了一下,发现以下代码:
InterfaceB b = new ClassB();
b.execute(arg0,arg1,arg2);

在B110上,ClassB以及其接口InterfaceB上声明的execute()方法是带2个参数的,而经过这些天的修改,在主干上ClassB和InterfaceB的execute()方法已经是3个参数了

我没注意到这个问题,改完ClassA中的bug,就直接把ClassA发到现场,所以当执行到b.execute(arg0,arg1,arg2)这句代码时,就报了NoSuchMethodError

不过当时没有看到这段出错的日志(日志是事后才发现的),只定位出execute()方法有问题,于是在ClassB的execute()中增加了一些调试日志,其中开头第一句是:
logger.debug("into ClassB.execute()");

替换之后发现,这句日志也没有打出来,这才反应过来是这个方法没有进去(不过歪打正着的是,主版本的ClassB发到现场了),再跟B110比对了一下,终于发现是方法的参数不对

于是又把主干上的InterfaceB也发到现场,问题就解决了

不过想想觉得有点不对劲,因为检查发现,ClassB中还有这么一段代码:
String pId = "abc";
String str = XXXConstants.XXX + pId;

那现在一共只发到现场以下3个.class:主干上的ClassA、ClassB、InterfaceB,根本就没有发XXXConstants过去,怎么ClassB不报错呢?

后来想到了,ClassB是在主干上编译的,所以主干上的XXXConstants.XXX,已经作为常量编译到ClassB里了,不需要发补丁到现场

总结:

1、一定要根据实际运行的环境出补丁。像今天这种情况,现场跑的代码是B110版本,主干上的代码已经比B110推进了好多天,2套代码根本就不一致。如果我今天是从B111版本上出补丁,那后面的麻烦事就都没有了

2、如果方法进不去,检查一下这个方法的参数是否正确

3、发补丁时,不能只发修改的类,要把相关的类一起提交

4、要小心static常量的陷阱,比如在ClassC里,有一个String str = XXXConstants.XXX,然后已经编译成了ClassC.class,那str的值就已经确定了。这个时候再去修改XXXConstants.XXX的值,不会对ClassC.class产生影响
分享到:
评论

相关推荐

    测试培训教材

    测试管理与QualityCenter培训手册 1、测试流程管理、测试度量方法 按照尽早进行测试的原则,测试人员应该在需求阶段就介入,并贯穿软件开发的全过程。就测试过程本身而言,应该包含以s下几个阶段。  -测试需求的...

    自动化测试面试题总结.docx

    6,三次握手过程 7,session和cookie的区别 8,tcp和udp的区别 9,sockect通信原理 10,post的三种请求方式 七、数据库 1,sql分类 2,数据库事务特性:ACID 3,mysql索引的类型 4,池化思想 5,redis 6,如何提高...

    asp.net知识库

    .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 ...

    Tcl_TK编程权威指南pdf

    1988年,当我在Berkeley做ousterhout教授的博士生时,第一次听说了Tcl。我们当时正在设计一种名为Sprite的网络操作系统。同学们在努力编制一个新式的内核程序,而John编写了一个新的编辑器和终端仿真程序。他使用Tcl...

    好笔头 v4.0.8官方版.zip

    可通过搜索快速定位所需笔记、资料或联系人,也可以通过多条件搜索来精准定位你要找的信息。 3、人脉累积 详尽的客户名片让您时时把握联系人性格、特点、喜好。避免遗忘的尴尬,二次见面即成朋友。 笔记提醒管理...

    数据运营思维导图

    运营的问题,是追踪出来的,不是一次就看出来的 所有的数据都是靠积累和沉淀才能发现问题,单一的数字没有任何意义,只能称为 “数值” 结合/拆分思路 追踪数据,多个维度结合分析。 从多个维度拆分数据 对比...

    2019数据运营思维导图

    宏观走势,是否需要进行市场投放 判断是否存在渠道作弊行为、渠道包被下架等问题 日一次会话用户数 即新登用户中只有一次会话,且会话时长低于门阀值 ——解决问题 推广渠道是否有刷量作弊行为 渠道推广质量是否合格...

    C#微软培训资料

    第一章第一章 第一章 .NET 编 编 编程语言 程语言编程语言 程语言 C#.4 1.1 Microsoft.NET——一场新的革命.4 1.2 .NET 与 C#.6 1.3 C#语言的特点.8 1.4 小 结 .11 第二章 运行环境 全面了解.NET....

    python入门到高级全栈工程师培训 第3期 附课件代码

    10 tcp三次握手与四次挥手 第30章 01 上节课复习 02 客户端服务端循环收发消息 03 socket收发消息原理剖析 04 服务端循环链接请求来收发消息 05 补充 06 udp套接字 07 recv与recvfrom的区别及基于udp实现ntp服务 ...

    图库新版jQuery焦点图 JS代码

    tips[36] = '所谓“网站定位”就是实事求是的基于各种现状总结出一个对内容建设、功能规划、服务运营有帮助的指导纲领。'; tips[37] = '不要相信“天下设计一大抄”我们可以借鉴,但绝不能抄袭!'; tips[38] = '学...

    vc++ 开发实例源码包

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

Global site tag (gtag.js) - Google Analytics