WEB开发网
开发学院操作系统Linux/Unix 内存调试技巧 阅读

内存调试技巧

 2008-11-13 08:31:57 来源:WEB开发网   
核心提示: 这些错误通常也不太严重,尽管 C 标准在这些情形中没有定义具体行为,内存调试技巧(4),但典型的实现将忽略错误,或者快速而明确地对它们进行标记;总之,内存中数据分配的布局非常复杂并且难以再现,所以任何症状都不可能追溯到源代码级别的具体错误,这些都是安全情形,悬空指针悬空指针比较棘手

这些错误通常也不太严重。尽管 C 标准在这些情形中没有定义具体行为,但典型的实现将忽略错误,或者快速而明确地对它们进行标记;总之,这些都是安全情形。

悬空指针

悬空指针比较棘手。当程序员在内存资源释放后使用资源时会发生悬空指针(请参见清单 5):

清单 5. 悬空指针

    void f8()
    {
    struct x *xp;
    xp = (struct x *) malloc(sizeof (struct x));
    xp.q = 13;
    ...
    free(xp);
    ...
      /* Problem! There's no guarantee that
     the memory block to which xp points
     hasn't been overwritten. */
    return xp.q;
    }

传统的“调试”难以隔离悬空指针。由于下面两个明显原因,它们很难再现:

即使影响提前释放内存范围的代码已本地化,内存的使用仍然可能取决于应用程序甚至(在极端情况下)不同进程中的其他执行位置。

悬空指针可能发生在以微妙方式使用内存的代码中。结果是,即使内存在释放后立即被覆盖,并且新指向的值不同于预期值,也很难识别出新值是错误值。

悬空指针不断威胁着 C 或 C++ 程序的运行状态。

数组边界违规

数组边界违规十分危险,它是内存错误管理的最后一个主要类别。回头看一下清单 1;如果 explanation 的长度超过 80,则会发生什么情况?回答:难以预料,但是它可能与良好情形相差甚远。特别是,C 复制一个字符串,该字符串不适于为它分配的 100 个字符。在任何常规实现中,“超过的”字符会覆盖内存中的其他数据。内存中数据分配的布局非常复杂并且难以再现,所以任何症状都不可能追溯到源代码级别的具体错误。这些错误通常会导致数百万美元的损失。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:内存 调试 技巧

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接