由于想看内存泄漏的情况,就把CC_REF_LEAK_DETECTION宏打开了,然后产品也上线了,出现了一堆崩溃日志。
由于IOS用户本来是要退出app,退出app的要销毁数据,退出的这个过程中出现了崩溃,理论上不影响用户体验,因为用户本来就要退出,崩的这个过程用户感知不到。 但是buggly 会出现一堆崩溃数据,求一个好的解决方案。
必须要改c++的代码,然后重新提交包,才能解决这个问题吗,在线等
由于想看内存泄漏的情况,就把CC_REF_LEAK_DETECTION宏打开了,然后产品也上线了,出现了一堆崩溃日志。
由于IOS用户本来是要退出app,退出app的要销毁数据,退出的这个过程中出现了崩溃,理论上不影响用户体验,因为用户本来就要退出,崩的这个过程用户感知不到。 但是buggly 会出现一堆崩溃数据,求一个好的解决方案。
必须要改c++的代码,然后重新提交包,才能解决这个问题吗,在线等
最简单的helloworld也会崩溃。
cocos2dx 3.17 lua 创建hellowrold工程。
修改CCRef.h文件中的CC_REF_LEAK_DETECTION 宏定义改为1
xcode编译调试,程序启动后,杀死进程,就会崩溃。 百分百必现。
#define CC_REF_LEAK_DETECTION 1
开启这个在异步/多线程中创建Ref添加进__refAllocationList容器会出问题,使用Ref::printLeaks()等也容易崩溃
而游戏免不了用多线程,所以引擎自带的这功能基本无法使用,需要修改下,
我是通过给__refAllocationList添加锁实现,大概代码如下
#include <mutex>
std::mutex __mutext
__mutext.lock(); __refAllocationList.push_back(ref); __mutext.unlock();
__mutext.lock(); auto iter = std::find(__refAllocationList.begin(), __refAllocationList.end(), ref); if (iter == __refAllocationList.end()) { log("[memory] CORRUPTION: Attempting to free (%s) with invalid ref tracking record.\n", typeid(*ref).name()); __mutext.unlock(); return; }
__refAllocationList.erase(iter); __mutext.unlock();