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

记录一次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 的实现将返回流中的字节总数,但也有很多实现不会这样做。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。

 

分享到:
评论

相关推荐

    Computer Bug计算机Bug的由来

    团队成员小心翼翼地取出了这只飞蛾,并将其贴在了当天的工作日志上,旁边写着:“First actual case of bug being found”(第一次真实发生的bug案例)。 这个事件不仅解决了当时的技术问题,更重要的是它创造了一...

    测试BUG流程管理规范

    - 示例:第一次修改是因为代码逻辑错误导致,第二次是因为数据库连接配置不当,第三次是因为前端界面未同步更新等问题。 **3. BUG解决优先级** - 开发人员根据BUG的优先级来调整自己的工作计划。 - **重要且紧急*...

    bugfree帮助文档

    - **批量运行**(仅限Test Case模式):一次性为多个Test Case创建Test Result,最多100个。 通过以上介绍,初学者可以对BugFree的基本操作和工作流程有初步了解,从而更好地进行缺陷管理和测试工作。在实际使用...

    软件测试通过及BUG分级标准

    假设在一次功能测试中发现了一个BUG,具体表现为某个功能在特定条件下无法正常工作。经过初步分析,确定此BUG为“严重级”。接下来的处理流程如下: 1. **记录**:记录下BUG的详细信息,包括出现的环境、复现步骤等...

    软件测试BUG清单分析说明

    如果一个BUG可以轻松地被重现,这表明问题可能具有普遍性,需要立即解决。测试人员应记录每次尝试重现BUG的难度,并据此给出相应的分数。例如,每次操作都能立即复现的BUG可得1分,而难以复现的BUG则得分更高。这样...

    BUGFREE功能扩展脚本

    BUGFREE是一款广泛使用的缺陷跟踪系统,它允许团队记录、分配和跟踪软件开发过程中的错误和问题。通过扩展脚本,用户能够定制化其工作流程,提高生产力。 在描述中提到的扩展脚本,其主要目的是在指定日期自动发送...

    关于一些bug的修复问题的解决

    在IT行业中,修复bug是软件开发过程中的常态。"关于一些bug的修复问题的解决"这一标题揭示了我们要探讨的核心内容:如何有效地...每个bug的修复都是一次提升软件质量的机会,同时也反映了开发者解决问题的技能和经验。

    bug-free bug管理系统

    - **定期清理**:定期清理已解决或不再需要的bug记录,保持系统的整洁。 - **有效沟通**:确保团队成员对bug的理解一致,及时更新状态和备注,避免信息滞后。 - **培训与规范**:为团队提供使用培训,制定统一的...

    Bugfree使用手册

    它借鉴了微软的研发流程和Bug管理理念,提供了一种简单实用的解决方案,尤其适合中小IT企业和技术开发团队。 **1. Bugfree的核心特点** 1. **先进理念**:Bugfree采用了微软的成熟研发流程和管理理念,使得问题...

    内核208天bug分析

    标题:“内核208天bug分析”描述:“腾讯大神写的内核timer调试笔记,典型的208天才重现一次的bug调试技巧” 知识点: 1. 内核bug现象:从描述中提到这是一个典型的内核bug,该bug表现形式为每208天重现一次,这种...

    bugfree3.0.4

    - **日志和历史记录**:系统记录每一次bug状态的变更,便于追溯和分析。 3. **IIS配置**:IIS(Internet Information Services)是Windows操作系统上的Web服务器,用户可以直接在IIS上配置Bugfree,无需其他Web...

    禅道bug流程.pdf

    在软件开发过程中,bug管理是一项至关重要的任务,它涉及到整个项目的质量和进度。本文档详细阐述了禅道bug管理规范及其处理流程,旨在为开发人员和测试人员提供清晰的指导,确保bug的有效追踪和解决。 首先,我们...

    java bug系统

    3. **Java**: Java是一种广泛使用的面向对象的编程语言,以其“一次编写,到处运行”的特性闻名。它具有丰富的类库和强大的跨平台能力,是构建复杂应用的理想选择。 4. **开源**: 开源软件意味着其源代码对公众开放...

    bugfree学习

    Bugfree是一款开源的缺陷跟踪管理系统,主要用于软件测试过程中的缺陷记录与管理。本文档将详细介绍如何搭建Bugfree环境,包括XAMPP的安装与配置,以及在解决各种安装过程中遇到的问题的基础上,对Bugfree进行安装,...

    软件测试中BUG数据分析

    在软件测试过程中,BUG数据分析是一项至关重要的工作,它涉及到对软件缺陷的全面理解和管理,以提升软件质量和用户体验。首先,我们需要明确缺陷的定义,包括软件未达到产品说明书的功能、表现与说明书不一致、超出...

    项目bug管理器,BugFree

    4. **关联与依赖**:BugFree支持将一个bug与其他bug关联,或者设定依赖关系,帮助团队识别和解决复杂的问题链。 5. **任务分配**:管理者可以将bug分配给特定的开发人员,明确责任人,提高问题解决效率。 6. **...

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

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

    bugBrain(神经网络游戏)

    在这款游戏中,玩家将与一个不断学习和适应的AI系统进行互动,这使得每一次的游戏过程都有可能带来全新的挑战和策略。下面,我们将详细探讨这款游戏的各个组成部分以及相关的知识点。 首先,游戏攻略文档提供了玩家...

    ARCGIS PRO官网发布的bug修改记录

    ### ARCGIS PRO官网发布的bug修改记录 #### 概述 ArcGIS Pro是Esri公司开发的一款高级地理信息系统软件,广泛应用于地图制作、空间数据分析、地理处理等多个领域。随着技术的发展与用户需求的增长,ArcGIS Pro不断...

    Bug管理系统 项目开发总结报告

    综上所述,本项目的开发不仅是对现有BUG管理流程的一次升级,也为未来的软件开发提供了重要的支持工具。通过对整个项目周期的详细规划和实施,不仅提升了团队的技术能力,也为组织带来了实际的价值。

Global site tag (gtag.js) - Google Analytics