如何检测24/7应用程序(例如在线游戏服务器)中的内存溢出?系统和工具是linux + gcc。
有时,内存溢出的原因是将内存写入数组之外;有时内存溢出的原因是无效指针。
那么,有没有人有这方面的经验并知道如何预防呢?
答案 0 :(得分:5)
答案 1 :(得分:2)
重新定义内存分配函数(例如malloc
)以分配比存储分配所需的缓冲区更大的缓冲区,并使用已知模式填充额外空间,并定期检查模式是否已经过损坏。
答案 2 :(得分:2)
正如其他人所说,在测试过程中使用valgrind
,并进行详尽的测试。为了在运行时进行保护,可以替换全局operator new
和operator delete
:替换应该在返回块的两侧保留一个保护块:operator new
将保护块初始化为预定义模式,operator delete
验证该模式是否仍然存在。 operator delete
也应该用一个独特的模式(不全0)覆盖实际内存,以增加检测使用悬空指针的概率。
对于所有数组,使用std::vector
,尤其是std::vector
的调试版本,应该防止所有覆盖,并立即在其发生的位置检测它(如反对当你最终释放记忆时)。但是,在最终应用程序中保留所有检查可能会导致性能下降(但值得一试)。
答案 3 :(得分:1)
使用valgrind's memory check运行程序。
尽可能对代码进行单元测试,然后再使用valgrind's memory check执行。