前一阵子,公司的一款SLG游戏要到海外上线。这款游戏的服务器程序原先是在centos6的环境中开发并运行在centos6上的,一组服主要由网关服和逻辑服组成。其中网关服接受客户端的tcp长连接,并转发客户端的请求消息到逻辑服,逻辑服处理好逻辑传给网关服,再由网关传回客户端。之前国服上线前运营方曾要求我们部署到centos7上,他们认为centos7会比centos6更安全运行效率更高。但考虑时间紧我们没迁移。于是等到这次海外上线时,我们准备把整套服务器代迁移到centos7上开发。编译部署很顺利,之后的内部测试也很顺利没出现什么异常。
然而游戏上线不久就发现客户端时不时地会收不到服务器的响应消息,查看客户端和网关服的链接,发现没问题,此时客户端还能发送请求消息到网关服。难道逻辑服挂了?登上服务器查看服务器进程,发现逻辑服进程还在,运行也正常。此刻,网关服接受客户端的消息正常,逻辑服也在工作,就是无法把响应消息发给客户端。进一步排查,我发现这时逻辑服能够收到来自网关服的消息,也能正确处理逻辑并把结果传给网关服,网关服的确也接受到了来自逻辑服的消息,就是没有再把这些包转发给客户端。很明显,问题应该出在网关服的网络通信层。继续查看网关服的网络收发日志,发现网关服收到的消息头中标示消息长度那个字段错乱了,这导致了后续消息再也无法正确解析,于是之后的来自逻辑服的消息再也无法转发给客户端了。
是什么原因导致消息头错乱呢?我初步分析可能的原因有两个:一是逻辑服发送消息时消息头已错乱,这种错误极有可能是本次新加的逻辑导致;二是逻辑服发送的消息没问题,网关接收时产生了错乱,这种错误极有可能底层库中网络通信模块有bug导致的。由于这个底层库我开发使用至今有7年了,并且国服之前一直运行地很稳定,所以我首先怀疑是新加的逻辑造成的。很不幸运,一番调试下来发现真不是新加逻辑导致的。难道是底层库中一直隐藏了这个bug?同样调试了一遍又一遍后,感觉貌似也不是底层的bug。毕竟这个库我已经使用了好几个项目了。
至此修复这个bug陷入困镜,我没了思路,只能修改代码,在可能导致bug的地方添加更详细的日志,然后当bug出现后排查之前之后的日志。通过一遍又一遍地排查日志,我终于发现一些bug出现的规律。首先出现这个bug总是出现在逻辑服向网关服发送大量的数据时。这种情况下为了给其他逻辑留点cpu时间,底层库只处理一定量的消息,剩余消息留给下一帧处理。国服和之前经历的项目都这么做的,没出啥问题。并且这次网关服收到一帧处理不了的大包时,也不是必出bug,而是有时出现,有时不出现。其次我发现出现bug前,网关服收到的消息类型似乎就那几种类型。我在逻辑服排查了产生那几条消息的代码,发现这些逻辑中有些设置google protocol buffer 的代码写得不太好,难道是误用这个库导致的?我优化了这部分代码,然后再调试。很可惜,那个bug仍旧顽强地存在着。
我只能回头继续从处理大包的底层代码去排查,继续加日志,继续查日志。排查来排查去,我又有了新发现:起初网关服收到大包时,数据都对的,但等到下一帧处理时数据又错了,很明显导致bug的代码位于将大包中没处理的消息移动到缓冲区顶部的代码中。进一步排查这部分代码,很遗憾仍旧没啥新发现,这部分代码好几年前就写好了,已经稳定运行了好几年了。无奈之下,我把焦点集中到了调用移动数据的那个libc函数memcpy上,因为这个逻辑最后一步就是调用这个函数的。难道这个函数有问题?不可能啊,这个可是系统提供的函数啊?我可以相信自己写的逻辑代码会出bug,自己写的底层库也会出bug,还有误用第三方库也会,但是系统提供的函数怎么可能出问题?毕竟centos这个操作系统的稳定性可是有口皆碑的。可是到目前为止我也实在找不出其他的原因,抱着死马当活马医的心态,我网上查了一下关于这个函数的资料。不看不知道,一看吓一跳,果然这个函数有点问题,原来使用这个函数时,当目标地址和源地址是处于同一块缓存时,拷贝的数据可能出错。这种变化正是升级到centos7之后才发生的。原来如此,这就解释了为啥之前在centos5,centos6上使用这个库写的服务器程序没这个问题,而升级到了centos7后才出了问题。也解释了为啥某些逻辑容易催发这个Bug,因为在这些逻辑中会催发大量的广播消息,这样逻辑服发给网关服会出现大量的大包。找到了确切的原因后,后面的修复就顺风顺水了,网上对我这种应用场景给出的建议是使用memmove函数替代,我照着做了,然后编译部署测试。终于这个困扰了我三天多的bug被彻底修复了。
随着这个Bug的修复,我感觉自己的修服务器程序bug的经验值又增长了一大截。并且在我的修bug的知识库中又多了一种bug类型,叫做升级操作系统的bug!
相关推荐
8. 导出BUG的最终格式:完成以上步骤后,BUG列表将以一种易于管理和查看的形式出现在Excel表格中,方便进行后续的数据分析和报告生成工作。 总结以上步骤,BugFree3.0.4导出BUG操作是一个涉及Web后台管理、数据格式...
BUG管理系统是一种专门用于记录、跟踪、分类和优先级排序软件BUG的工具。它的主要功能包括: 1. **问题报告**:提供用户友好的界面,使开发团队之外的任何人都能方便地报告他们遇到的问题,包括详细描述、复现步骤...
在技术选型上,Bugfree选择了JSP(JavaServer Pages)作为前端展示层,这是一种基于Java的技术,能够将动态内容嵌入到静态HTML页面中。JSP允许开发者使用Java代码来处理服务器端的任务,如数据处理、业务逻辑控制等...
3. **Java**: Java是一种广泛使用的面向对象的编程语言,以其“一次编写,到处运行”的特性闻名。它具有丰富的类库和强大的跨平台能力,是构建复杂应用的理想选择。 4. **开源**: 开源软件意味着其源代码对公众开放...
综上所述,构建一种Bug自动生成系统对于交通装置的软件质量控制至关重要。它涵盖了从代码分析到测试执行、缺陷管理等多个环节,旨在通过自动化手段提高测试覆盖率和效率,降低交通装置软件出现故障的风险,从而保障...
本文将深入探讨“软件测试BUG清单分析”,旨在提供一种有效的评估方法,以便测试人员和开发人员能够更好地理解和处理这些问题。 首先,BUG的重现度是评估其严重性的基础。如果一个BUG可以轻松地被重现,这表明问题...
在Linux操作系统中,管理和追踪bug是一项至关重要的任务,特别是在软件开发和维护过程中。"Linux下的bug管理系统"这个主题涵盖了如何在Linux环境中有效地管理和解决软件缺陷。"nucrse"通常指的是ncurses库,它是一个...
版本验收与放行标准是软件测试中的一种重要标准,旨在确保软件的质量和可靠性。本标准对软件测试中的BUG等级进行了明确的规定和分析,并结合软件放行的评价标准。 一、版本验收标准 版本验收标准是软件测试中对...
这两种模式各有优劣,具体使用哪一种取决于项目需求和个人偏好。 3. **数据库管理**:项目包含了BUG_Data.MDF和BUG_Log.LDF文件,这表明系统使用了SQL Server的本地数据库文件。这些文件分别对应主数据文件和日志...
"BUG统计图表模板1"提供了一种系统化的方式来跟踪和分析这些问题,以便于优化产品并提高质量。以下是对该模板中各个部分的详细解释: 1. **按模块统计**:这一部分用于统计BUG在不同模块中的分布情况。例如,模块一...
Bug管理系统是一种用于软件开发过程中跟踪、管理以及解决错误和缺陷的工具。在PHP环境中,这样的系统可以帮助团队有效地处理代码中的问题,确保软件的质量和稳定性。本文将深入探讨PHP实现的Bug管理系统的关键知识点...
1. **BUG跟踪系统**:在软件开发过程中,BUG跟踪系统是一种至关重要的工具,它用于记录、分类、优先级排序以及管理软件中的错误或缺陷。这样的系统帮助开发团队有效地追踪问题,确保它们得到及时解决,从而提高软件...
总之,Win11任务栏搜索Bug修复程序升级版是一个针对Windows 11操作系统中搜索功能问题的有效解决方案,它利用C#开发语言和后端技术,为用户提供了一个简洁的界面,帮助他们更轻松地解决搜索功能故障。通过理解和应用...
BugFree的安装较为简便,文档中提到了在Windows操作系统下,用户需要搭建PHP集成环境,并按照步骤安装BugFree3。用户还可以从旧版本升级,以便不中断现有工作流程。安装成功后,用户可以快速开始使用BugFree系统,...
【BUG管理系统】是一种用于软件开发过程中追踪和管理错误、缺陷以及改进建议的工具。它确保了团队能够有效地识别、记录、优先级排序、分配和解决软件中的问题。在这个项目中,"struts"、"hibernate"、"spring" 和 ...
这个文件很可能是包含Bug详细信息的文本文件,包括Bug的现象、发生环境(操作系统、Java版本等)、错误日志、用户反馈以及可能的解决方案建议等。 **详细知识点:** 1. **Bug的定义**:在软件开发中,Bug指的是...
4. **环境信息**:提供出现问题的软件版本、操作系统、浏览器类型、硬件配置等,这有助于判断问题是否与特定环境有关。 5. **截图与日志**:附上问题发生时的屏幕截图或错误日志,视觉化的证据往往比文字描述更有...
Bug 是软件测试中最重要的一部分,它可以分为多种类型,每种类型都有其特点和解决方法。以下是 bug 的分类和状态: bug 的分类 1. 功能缺陷:业务流程为实现,例如某个功能没有实现或实现不正确。 2. 代码错误:...
VBA是Excel内置的一种编程语言,用于自动化和扩展Excel的功能。在这个场景中,VBA可能被用来编写宏,实现如自动更新状态、验证输入、发送邮件通知等功能。 4. **宏安全级别**: 使用VBA宏时,用户需要将Excel的...