`
san_yun
  • 浏览: 2598034 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

记录一次bug解决过程

 
阅读更多

前天使用jython全量build数据中间总会出现字符乱码问题,浪费了很多时间找问题原因,记录一下问题解决过程。

 

问题现象:

2013-09-27 15:39:08 [ERROR] com.duitang.dboss.client.SimpleServiceProxy  - service invoke faild!
org.codehaus.jackson.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 0)): has to be escaped using backslash to be included in string value
 at [Source: java.io.StringReader@2710e110; line: 1, column: 387287]
        at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1433)
        at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:521)
        at org.codehaus.jackson.impl.JsonParserMinimalBase._throwUnquotedSpace(JsonParserMinimalBase.java:482)
        at org.codehaus.jackson.impl.ReaderBasedParser._finishString2(ReaderBasedParser.java:1359)
        at org.codehaus.jackson.impl.ReaderBasedParser._finishString(ReaderBasedParser.java:1330)
        at org.codehaus.jackson.impl.ReaderBasedParser.getText(ReaderBasedParser.java:200)
        at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.deserialize(UntypedObjectDeserializer.java:59)
        at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.mapObject(UntypedObjectDeserializer.java:218)
        at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.deserialize(UntypedObjectDeserializer.java:47)
        at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.mapArray(UntypedObjectDeserializer.java:165)
        at org.codehaus.jackson.map.deser.std.UntypedObjectDeserializer.deserialize(UntypedObjectDeserializer.java:51)
        at org.codehaus.jackson.map.deser.std.MapDeserializer._readAndBind(MapDeserializer.java:319)
        at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:249)
        at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:33)
        at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)
        at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863)
        at com.duitang.dboss.client.SimpleServiceProxy.doExecute(SimpleServiceProxy.java:76)
        at com.duitang.dboss.client.SimpleServiceProxy.execute(SimpleServiceProxy.java:48)
        at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:186)
        at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:204)
        at org.python.core.PyObject.__call__(PyObject.java:438)
        at org.python.core.PyObject.__call__(PyObject.java:442)
        at org.python.core.PyMethod.__call__(PyMethod.java:151)
        at dboss$py._JServiceProxy__invoke$42(/duitang/dist/app/main/java/japa/src/main/webapp/dboss.py:342)

 

过程分析:

1. 猜测一:数据的问题

通过报错原因应该是dboss返回的字符串包含特殊字符导致的。之前以为是某些数据包含特殊字符导致的,但是把导致错误ids记录下来测试却不会报错。

 

2.猜测二: 和数据没有关系

之前每次通过build数据报错来验证,这样每次测试话费很多时间,后来转念一想,也许和数据没关系吧,在本地写了一个测试脚本:

        DbossClient dbossClient = new DbossClient(map);
        final ServiceProxy blogQueryService = dbossClient.getService("blogQueryService");
        for (int i = 0; i < 1000; ++i) {
            try {
                List<Long> ids = new ArrayList();
                for (int j = 0; j < 2000; ++j) {
                    ids.add(8772421l);
                }
                Object result = blogQueryService.execute("queryBlogDetail", new Object[] { ids });
                System.out.println(i);
            } catch (Exception e) {
                e.printStackTrace();
                break;
            }
        }

 靠,居然能重现问题,果然和数据关系,应该是大数据量传输的问题。

 

3.猜测三: buf读取的问题

现在问题很好定位了,之前修改了readLine方法:

 public String readLine(int length) throws IOException {
        int bytesToRead = Math.min(input.available(), length);
        ByteArrayOutputStream output = new ByteArrayOutputStream(bytesToRead);
        int index = 0;
        byte[] buffer = null;
        while (true) {
            buffer = output.toByteArray();
            index = ToolUtil.indexOf(buffer, EOF);
            if (index >= 0) {
                break;
            }
            bytesToRead = Math.min(input.available(), length);
            if (bytesToRead > 0) {
                byte[] bytes = new byte[bytesToRead];
                input.read(bytes);
                output.write(bytes);
            } else {
                int b = input.read(); // 此操作会阻塞,直到有数据被读到
                if (b < 0) {
                    throw new IOException(
                                          " end of the socket input stream has been reached,may be server socket is closed!");
                } else {
                    input.unread(b);
                    continue;
                }
            }
        }
        return new String(buffer, DbossClientConstant.ENCODE);

    }

 但这个方法存在一个bug,其实很基础,原来input.available()返回的可用字节数,不一定保证input.read(bytes)实际能读取这么多。请看available()是如何描述的:

javadoc写道
返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此估计数个字节不会受阻塞,但读取或跳过的字节数可能小于该数。

注意,有些 InputStream 的实现将返回流中的字节总数,但也有很多实现不会这样做。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。

 

分享到:
评论

相关推荐

    BugFree(Bug跟踪管理系统) v3.0.rar

    我们在2.x 版本的兼容和升级上做了大量的工作,但毕竟是一次完全的技术重构,系统稳定性和用户体验还需要在后续版本不断完善。提醒大家在对BugFree进行升级之前,对原有数据进行备份。也非常欢迎大家就使用过程中的...

    淘宝自动发货-淘小白

    1.多个卡密多次发送改为一次发送等,修复卡密发送 2.修复检测订单后总是提示库存不足的BUG 3.修复内存错误1.多个卡密多次发送改为一次发送 2012-03-25(1.9.5) 1.修正淘宝登陆判断条件所导致的失败 2012-03-25...

    测试培训教材

    按照尽早进行测试的原则,测试人员应该在需求阶段就介入,并贯穿软件开发的全过程。就测试过程本身而言,应该包含以s下几个阶段。  -测试需求的分析和确定。  -测试计划。  -测试设计。  -测试执行。  -...

    Erphpdown插件 WordPress收费下载/收费查看隐藏内容/在线充值/前端个人中心/用户推广提现

    一次购买,永久下载 colorbox灯箱弹窗特效 前端个人中心(可直接充值、查看消费等) 更新记录: 修复bug,下载地址可设置网盘名称以及提取码 (v9.2.4 2018.05.28) 修复bug,下载页面显示资源标题 (v9.2.3 2018.05...

    易语言程序免安装版下载

    易语言5.1 相对于易语言5.0更新说明: ... 修改XML解析支持库,增加写出CDATA数据功能,解决解析XML时错误的丢弃换行和TAB字符的BUG,解决读取节点值时对CDATA数据进行转义处理的BUG。 20. 修改扩展界面支持库...

    解决Android studio Error:(30, 31) 错误: 程序包 不存在的问题

    记录这个bug,不是说这个问题有多么难,而是在解决之前,尝试了很多办法,它是一个不断试错的过程,比如: 多次的 clean project/ rebuild project; 查看主项目下的build/ 查看编译之后的.class 文件,发现并不存在...

    手机 pdf 阅读器

    每一次打开UMD时,如果存在UMD书签,则自动导入,为了节约内存,如果超过150个书签,打死都不加了,而且,也不允许用户自己添加(此规则对所有的历史同样有效,即一个历史中,不能保存超过150个书签) 阅读时,具有...

    数据库开发框架(PDF版)

    打开CLIENTXiandi.exe即可使用,密码为空这个版本是没有完成的版本,但材料的进销存还是可以用的,请帮助测试==============================2005-10-12 jacky 第一次做开发记录以前所有的都没有做开发记录,所以很多...

    好笔头 v4.0.8官方版.zip

    好笔头用最简单的方式,帮助企业解决移动办公(OA)、客户管理(CRM)、团队沟通、移动签到、工作汇报、成员管理、绩效考核等问题;能帮助员工对信息进行分类整理、做好客户跟进、提升工作效率,最终提升业绩的实用...

    《Show Stopper!: The Breakneck Race to Create Windows NT and the Next Generation at Microsoft by G. Pascal Zachary》

    《Showstopper》一书以 NT的开发过程为线索,生动了描述了5年中的很多精彩故事,特别是NT团队如何解决开发中的Showstopper类问题的动人情节。该书活生生的塑造了一系列著名的人物:包括Bill Gates、今天的微软CEO ...

    文章管理系统

    3.[纠正]纠正部分浏览器后台导航菜单间间隔背景图会重复显示多次BUG 4.[纠正]纠正前台导航下拉二级菜单多次经过会出现重复伸缩问题 5.[纠正]选择服务器文件页面没有滚动条的BUG 2014年03月07日 V2.82更新包 1.[新增...

    SlidingCard相册滑动翻页效果

    可支持任意张照片,但是一次只会显示最前面的三张,随着滑动翻页,依次向后加载,加载完毕后循环从第一张加载。 1.2版本更新 2015.8.5 修复了左滑和右滑图片出现BUG的问题. 1.1版本更新 2015.7.18 解决了锯齿问题。

    multiCCL_f

    未能生成完整的模板,导致很多使用者第一次使用时无所适从, 2.将内存定位的一个容易引起误解的“判断……”改为“将判断……” (以上两处BUG感谢网友woaicomputer等的反馈) 3.增加了定位注入数据块的特征码的...

    软件病毒特征码定位软件multiCCL

    未能生成完整的模板,导致很多使用者第一次使用时无所适从, 2.将内存定位的一个容易引起误解的“判断……”改为“将判断……” (以上两处BUG感谢网友woaicomputer等的反馈) 3.增加了定位注入数据块的特征码的...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正CheckBox控件的CheckedChanged事件会被触发两次的BUG(Data PostBack-&gt;AutoPostBack, Event PostBack-&gt;EnablePostBack)。 -为TextBox,TextArea,DatePicker,NumberBox,TriggerBox等控件增加AutoPostBack属性...

    asoft签到管理系统tykq3.5_build20110125

    旷工:未按时进行预定义的签到动作的行为,例如,每天设定了上午下午两次签到点,上午未签到将为上午记录一次旷工;下午同理。 轮班:在用户绑定到某一签到组后(例如签到时间为早8:00~12:00,下午14:00~18:00...

    今客CRM客户关系管理系统 完美版 v13.0.zip

    使客户感觉到企业的力量所在、企业的精神所在,企业在客户心中的形象在每一次与客户接触中不端的提高。 ④对业务人员 对业务人员(如:销售员、客户服务代表、现场服务工程师)来说,通过计划性地销售工作安排和...

    软件测试经典面试题 (超实用)

    73、请以您以往的实际工作为例,详细的描述一次测试用例设计的完整的过程。 23 74、您以往是否曾经从事过性能测试工作?如果有,请尽可能的详细描述您以往的性能测试工作的完整过程。 23 75、你对测试最大的兴趣在...

    asp.net知识库

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

    ExtAspNet_v2.3.2_dll

    -修正CheckBox控件的CheckedChanged事件会被触发两次的BUG(Data PostBack-&gt;AutoPostBack, Event PostBack-&gt;EnablePostBack)。 -为TextBox,TextArea,DatePicker,NumberBox,TriggerBox等控件增加AutoPostBack属性...

Global site tag (gtag.js) - Google Analytics