【问题标题】:Memory related errors内存相关错误
【发布时间】:2010-01-03 10:13:21
【问题描述】:

我的工作主要使用 C 语言。我遇到了很多问题,并花了很多时间调试与动态分配的内存损坏/覆盖相关的问题。与 malloc(A) A 字节类似,但使用 write 多于 A 字节。当我阅读时,我试图阅读一些东西:-

1.) 一种分配比所需更多内存的方法。并在额外的位置写一些已知的值/模式。然后在程序执行期间,该模式应该保持不变,否则它表示内存损坏/覆盖。但是这种方法是如何工作的。这是否意味着对于使用 malloc() 分配的指针的每次写入,我都应该对附加的哨兵模式进行内存读取并读取它的完整性?那会使我的整个程序非常慢。 并且说我们可以从代码的发布版本中删除这些检查,也不是富有成效的,因为与内存相关的问题在“真实场景”中可能会发生更多。那么我们可以处理吗?

2.) 我听说有一种叫做 HEAP WALKER 的东西,它可以让程序检测与内存相关的问题?怎么能做到这一点。

谢谢。

-AD。

【问题讨论】:

  • 92 个问题但只接受了 18%?这是为什么呢?

标签: memory


【解决方案1】:

如果您在 Linux 或 OSX 下工作,请查看 Valgrind(免费,在 OSX 上通过 Macports 获得)。对于 Windows,我们使用 Rational PurifyPlus(需要许可证)。

您还可以查看Dmalloc 甚至Paul Nettle's memory manager,这有助于跟踪与内存分配相关的错误。

【讨论】:

    【解决方案2】:

    如果您使用的是 Mac OS X,则有一个很棒的库,名为 libgmalloc。 libgmalloc 将每个内存分配放在一个单独的页面上。任何超出页面的内存访问/写入都将立即触发总线错误。但是请注意,使用 libgmalloc 运行您的程序可能会导致显着减速。

    【讨论】:

      【解决方案3】:

      内存守卫可以捕获一些堆损坏。它速度较慢(尤其是释放),但它仅用于调试目的,您的发布版本不会包含此内容。

      堆遍历是特定于平台的,但不一定很有用。最简单的检查是简单地包装您的分配并将它们记录到一个文件中,其中包含您的调试模式的 LINEFILE 信息,并且大多数任何泄漏都会很快显现出来你退出程序,数字不合算。

      在 google 上搜索 LINE,我相信会有很多结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 2015-10-16
        • 1970-01-01
        相关资源
        最近更新 更多