我被要求维护一个大型的C++代码库,里面存在大量内存泄漏的问题。在研究时,我发现有很多缓冲区溢出导致了这些泄漏(不想知道是怎么变得这么糟糕的)。
我决定先解决缓冲区溢出的问题。为了让我的错误调试更容易,有哪些工具可以用来检查缓冲区溢出?
我被要求维护一个大型的C++代码库,里面存在大量内存泄漏的问题。在研究时,我发现有很多缓冲区溢出导致了这些泄漏(不想知道是怎么变得这么糟糕的)。
我决定先解决缓冲区溢出的问题。为了让我的错误调试更容易,有哪些工具可以用来检查缓冲区溢出?
在 Linux 上,我会使用 Valgrind。
IBM的Purify可以做到这一点,您可以在其下运行您的应用程序,它会给您一个所有错误的报告(包括其他错误)。
要消除内存泄漏,请使用UMDH - 运行您的应用程序,拍摄内存快照,再次运行它,拍摄快照,然后使用差异工具查看自第一次运行以来所做的分配(请注意,您必须运行您的应用程序一次,并尽可能地拍摄快照)。
请查看Electric-fence,它专门设计用于防止缓冲区溢出!它不会减慢代码本身的速度(但会减慢分配/释放内存的速度)。它可以在Linux和Windows上使用。
它通过在每个已分配空间之前和之后添加一个没有读取或写入权限的段来工作。在UNIX上尝试访问此内存会导致分段错误,而在Windows上会导致内存违规(或类似的错误)。
MS:
我推荐使用 Rational Purify。它非常强大,但价格也相对较高。它可以轻松解决许多问题,并且真的可以为自己赚钱。此外,它可用于大多数*nix系统。不过,我不确定它是否适用于Windows系统。
编辑于2011年6月1日:CheckPointer工具已经投入生产。仍然只适用于C / Windows。处理多个C方言:MS Visual C,GCC 3/4。
编辑于2012年5月5日:CheckPointer现在处理C99,包括检查标准C和C99库的调用。