下面以对KOEI的无双大蛇的一个bug的研究为例,介绍程序分析的基本方法。

无双大蛇是KOEI公司推出的一款动作类游戏,3.20日发布了日文PC版。
在游戏过程中发现,进入某些战斗的时候程序会陷入死循环,具体表现是在菜单中选择战斗场景之后,画面变黑,但是一直不出现战前配置的界面。Alt+F4关闭主窗口之后,还可以在任务管理器中找到它的进程。
因为是进入战斗场景时发生的问题,猜测可能是读取或者解析场景数据的时候发生了错误。因为无双系列的数据量较大,通常场景数据不会保存在内存中,而是直接从文件读取,所以先用SysInternals中的procmon工具对文件读写进行监控,以便定位场景数据。
监控之后发现程序在使用ReadFile一次性读取大量数据(>35M)的时候失败(procmon中给出的错误信息是insufficient resource),然后程序一直在重试,从而导致了死循环。
使用关键字“ReadFile "insufficient resource"”Google了一下,没有发现太有价值的线索。
我自己写了个测试程序读取相同位置相同数量的数据,没有任何问题。因此暂时无法准确定位读取失败的原因。

正好要对大蛇的主程序进行分析,所以也顺便研究一下这个bug。
首先,因为自己的测试程序可以成功读取,所以怀疑是读取参数的原因导致ReadFile失败。因为ReadFile本身通常不会带参数(虽然最后一个参数是用于指定overlap的,但是通常很少用到),所以先研究CreateFile调用时传递的参数。
很快定位到程序中打开数据文件的代码,发现它在CreateFile的时候传递了FILE_FLAG_NO_BUFFERING参数。MSDN了一下,里面只提到使用该参数需要注意一些对齐的问题。
修改了我自己的测试程序,加入了FILE_FLAG_NO_BUFFERING参数。这次终于重现了bug,查看GetLastError的返回值,发现确实是ERROR_NO_SYSTEM_RESOURCES。
再次使用Google,加入新获得了两个关键字FILE_FLAG_NO_BUFFERING和ERROR_NO_SYSTEM_RESOURCES,可以找到更多相关的链接。浏览之后,基本可以肯定是一次性读入过多的数据导致的问题。
http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.kernel/2005-02/0489.html

因为问题实际上并不是FILE_FLAG_NO_BUFFERING参数导致的,所以我们去掉这个关键字。另外我觉得很多人应该会把该行为当成bug(因为MSDN上并没有提及),所以在关键字中加入bug,以期望进一步验证我的判断。然后重新搜索,得到了一个非常有价值的链接:
http://svn.icculus.org/physfs/trunk/lzma/C/Archive/7z/7zMain.c?view=markup&sortdir=down&pathrev=923
里面明确提到了这个问题
/*
   ReadFile and WriteFile functions in Windows have BUG:
   If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1)
   from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES
   (Insufficient system resources exist to complete the requested service).
*/

这说明,当碰到了bug,并且你已经掌握了较为详尽的出错相关信息的时候,可以直接通过Google的codesearch,或者koders网站在开源软件的代码中进行搜索,以充分利用前人的分析结果。(其实MFC的源代码注释中也有很多类似的信息)

当然最后修复这个bug就很简单了,自己写一个以4M为单位读取文件的代码,然后做个内存补丁即可。

程序分析实例 - 无双大蛇(Orochi)相关推荐

  1. psp模拟器完美字库_安卓PSP模拟器评测:《无双大蛇》最强无双

    <无双大蛇>是由日本KOEI TECMO开发的一款无双游戏,属于无双大乱斗游戏,2008年在PSP发布,原来是发布在PS2游戏主机上面的,游戏讲述的是<无双大蛇>以魔王·远吕智 ...

  2. 游戏合集 (4) 极品飞车21:热度 无双大蛇3 帝国时代2:决定版 死或生6 城市:天际线

    1游戏合集 (4) 1.极品飞车21:热度 <极品飞车:热度>是由Ghost Games制作的<极品飞车>系列游戏新作,是<极品飞车>系列的第21部作品,游戏于20 ...

  3. 三菱5uplc伺服电机指令_三菱PLC伺服实例程序分析应用

    文章分享:三菱PLC伺服实例程序分析应用. 1.原点回归程序示例: 三菱PLC伺服实例程序分析应用 M1250 原点回归启动按键 Y50 定位启动 (私服参数) Y44 轴停止 (私服参数) Y40 ...

  4. java商城项目中多线程执行_java多线程中执行多个程序的实例分析

    我们知道多线程因为同时处理子线程的能力,对于程序运行来说,能够达到很高的效率.不过很多人对于多线程的执行方法还没有尝试过,本篇我们将为大家介绍创建线程的方法,在这个基础上,对程序执行多条命令的方法进行 ...

  5. C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断...

    C#保留2位小数几种场景总结 场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.25. ...

  6. wireshark抓组播数据_捕获广播或多播地址数据MAC地址数据端口应用程序数据Wireshark网络分析实例集锦大学霸...

    捕获广播或多播地址数据MAC地址数据端口应用程序数据Wireshark网络分析实例集锦大学霸 Wireshark网络分析实例集锦大学霸 3.8.3  捕获广播或多播地址数据广播地址就是当IP地址的网络 ...

  7. python蟒蛇绘制实例分析_2.4蟒蛇绘制程序分析

    蟒蛇绘制程序分析 python蟒蛇实例 import turtle def drawSnake(rad, angle, len, neckrad): for i in range(len): turt ...

  8. JAVA数轴分界含义,1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。  用JAVA 谢谢 每部要有注释求大...

    满意答案 ajodnp 2014.10.05 采纳率:52%    等级:12 已帮助:6046人 这个挖,你程序的主体我没看到,不太确定 估计可能是:x=sqrt(i+100); y=sqrt(i+ ...

  9. Unix 网络编程(四)- 典型TCP客服服务器程序开发实例及基本套接字API介绍

    转载:http://blog.csdn.net/michael_kong_nju/article/details/43457393 写在开头: 在上一节中我们学习了一些基础的用来支持网络编程的API, ...

最新文章

  1. 协方差矩阵介绍及C++/OpenCV/Eigen的三种实现
  2. Java中的集合类--复习
  3. redis之zskiplist
  4. c语言 中insert变量值,c – 在VS2010中的vector :: insert执行意外结果
  5. echart 高度 不用 不撑满_高度、长度可调节的输送机,能延伸至货车内部,堪称装卸神器...
  6. MVC+EF三层+抽象工厂
  7. filter过滤后重新添加_Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener
  8. 怎么把4399小游戏的代码_25行代码带你爬取4399小游戏数据,看下童年的游戏是否还在...
  9. JavaScript:变量提升作用域
  10. 嵌入式linux串口编程(二)
  11. Ubuntu 20.04 虚拟显示器 1080P 配置
  12. 实验二 贪吃蛇游戏开发
  13. 图片转换js (img对象,file对象,base64,canvas对象),以及图片压缩方式
  14. win10以太网没有有效的ip配置
  15. 网络模拟环境 NS-2仿真软件简介
  16. 山东大学为什么火了_比校花更诱人,山东大学因为它,火了!
  17. Very Good!!! - React 入门实例教程
  18. 2018红帽杯线上预选赛 wp---MISC
  19. 求职面试:怎样克服面试紧张
  20. VisionMobile 2011年智能手机数据

热门文章

  1. 打开cad2020,显示AutoCAD错误中断,致命错误
  2. Analyze 菜单分析
  3. Flexcell 导出Excel 打不开,提示Excel在“XXXX.xls” 中发现不可读取的内容。是否要回复此工作薄的内容?如果信任此工作薄的来源,请点击“是”。...
  4. 大数据就业方向_大数据专业就业前景怎么样
  5. LPCTSTR LPCWSTR LPCSTR
  6. QQ录屏的文件保存的位置
  7. 达梦数据库忘记密码?
  8. php 正则匹配乱码,php正则匹配utf-8编码的中文汉字
  9. SSH初探:通过查看GPU的PID获取USER详细信息
  10. 初识软件测试-Blog1