论野指针BUG查找方法

梦想游戏人
目录:
C/C++

一般raw指针的使用才会容易出现这类问题,使用了指针管理的一般不容易出现因此这里不阐述(shared_ptr unique_ptr)等。

在展开叙述前,我们先看看下面的实现原理和方案:

1.在Unity引擎中GameObject等unity内置对象,如果被Destroy后,所有的 引用变量都会变为null,Unitiy做到这一点的方法是类似于重载== !=等操作符,使用前,确认一下cpp侧的指针是否有效。

这里得到的启示是指针可以不直接使用,通过封装的方式保持一个handle,通过handle去指代真实指针,来实现可追踪,可记录,可有效性验证。

2.PhysX物理引擎中,内存分配清理调用点都会记录文件函数 行号等RTTI信息,以供日志输出。

野指针形成的根本原因是 析构了的指针,还在被使用。生命周期管理逻辑混乱,异常处理,时序,多线程访问等都会导致这些问题。

所以BUG查找就变为,内存清理点调用的逻辑正确性是查找BUG的切入点,追踪到清理调用点,这个可以通过记录RTTI信息来查找到哪一行代码引发的清理,接下来就是通过阅读代码逻辑来查找代码逻辑的正确性了。

Scroll Up