使用dr.memory在win32环境下调试 cocos2dx 项目的内存异常
最近一周的时间在修改一个内存异常导致的crash,只在真机上出现,重现率很低。想重现的时候玩1个小时也不出来,不想重现的时候又钻了出来。改起来很痛苦。 今天发现了一个内存异常调试的软件,叫做 dr.memory 。尽管还没有用它真正解决这个问题,但是这个软
最近一周的时间在修改一个内存异常导致的crash,只在真机上出现,重现率很低。想重现的时候玩1个小时也不出来,不想重现的时候又钻了出来。改起来很痛苦。
今天发现了一个内存异常调试的软件,叫做 dr.memory 。尽管还没有用它真正解决这个问题,但是这个软件发现这个软件确实很好用,能在windows环境下和 vs 配合使用。记录在这里。
dr memory 是专门调试内存异常的工具,能够发现许多错误的内存操作,主要是内存操作越界, 内存泄漏, 使用未分配内存, 资源泄露等。而且还能跨平台使用,支持 win32 (64位据说不支持) , linux 和 mac.今天我只在 win32环境下用到了。
这个软件下载后,是个安装包,安装完毕之后是几个 exe . 里面有个 doc 文件夹, 有一个网页说明文档,具体如何操作说的很详细。
如果是用 vs 和他配合使用的话, 需要 在编译时,按照这个说明文档, 配置一些编译选项,主要是去掉各种内存上的优化。 因为我在调试一个 cocos2dx 的工程,因此工程里每一个项目,都需要按照这个规定来修改编译选项。改好之后编译,编译出来 exe 以后,可以用drmemory 这个软件启动。具体的说明文档里面都有。
在软件运行过程中,控制台会实时输出当前发现的问题, 在最后游戏关闭时,会把这些问题汇总到一个 log 文件里,里面写着哪个 cpp 哪个函数有问题 ,包括堆栈都摆在那里。
如果是内存泄漏的话,它会告诉你哪里 new 的 哪里 delete 的不正确。还会把它猜测可能有问题的地方列举上去。
我做了一些简单的实验, 内存泄漏, 指针操作越界, 指针强制转换不正确 等一些相对明显的问题,都能很清晰的记录下来。 许许多多比较低级的内存使用细节错误都逃不出 drmemory 的法眼。
尽管还没彻底解决项目中遇到的最棘手的问题,但是为我解决这个问题,提供了一些非常有用的线索,之前一直怀疑可能有问题的地方,都被log 标记了出来,明天可能要对着这些log 仔细分析一番。
总之,以前我没接触过类似的软件,我觉得这个软件非常好用! 感觉 xcode 的 instrument 虽然能够找到一些内存泄漏问题,但是对c++代码内存错误的使用没有什么更好的办法(也可能是我不会用)。但这个软件在 c++ 内存使用问题的解决上, 貌似比 instrument 更胜一筹。
具体结合 2dx 项目上,它会把许多参数传空指针的问题列举出来, 也会因此报出许多引擎内部的错误。有些地方似乎是误报,但是因为输出的 log 结构清晰,尽管很多没用的信息,也并不影响 log 分析。并且仔细阅读 dr memory 的文档可以发现能够用参数过滤掉许多不想要的 log内容。
总之个人感觉 dr memory 非常好用,能够迅速定位相对明显的c++新手可能常犯的内存使用错误 , 也能够给隐藏得比较深的问题提供线索.
非常推荐被内存问题折磨得体无完肤的 C++程序员尝试 !