4

我们有一个内存覆盖问题。在某些时候,在我们的程序过程中,一个内存位置被覆盖并导致我们的程序崩溃。该问题仅在发布模式下发生。在调试时,一切都很好。这是一个经典的 C/C++ 错误,而且很难找到。

我想知道是否有办法添加一些“调试代码”来监视这个内存位置并在它改变后调用回调。这基本上是调试器在调试模式下可以做的事情(“数据断点”),但我们在发布时需要类似的东西。

4

5 回答 5

10

如果您可以控制变量的位置,那么您可以在专用页面上分配它并将页面的权限设置为仅允许使用VirtualProtect读取(在 Windows 上......对于 Linux 不确定)。

这样,当有人尝试写入时,您将遇到访问冲突。使用异常翻译函数,您可以将其视为回调。

即使您不能直接移动变量(例如,它是类成员),也许您可​​以在变量周围添加足够的填充以确保它位于专用页面上并使用相同的方法。

于 2009-11-06T17:23:37.620 回答
7

您仍然可以为“发布”代码段生成调试符号。这仍然可以通过调试器运行,就像您在“调试”模式下一样。

我最近对我们的一个发布驱动程序做了一些类似的事情,以便我们可以通过 vtune 运行它。对于 Microsfot LINK,我添加了-DEBUG标志,对于 Microsoft CC,我添加了-Zi. 一切正常。MSKB 链接

您可能会发现此链接很有用。

于 2009-11-06T17:28:55.467 回答
3

假设您正在使用 windows 使用 windbg 来调试您的程序并检查 ba 命令 - 这将在访问内存时中断。

于 2009-11-06T17:36:02.790 回答
1

有一些工具可以解决这个问题——比如堆代理和边界检查器以及许多其他会发现覆盖的工具。基本上,您在内存分配结束时需要一些哨兵,并且需要对其进行检查。

于 2009-11-06T17:31:48.007 回答
0

调试 API 是特定于平台的,但它们确实存在。 可以在线找到WindowsUNIX API。

于 2009-11-06T18:03:35.333 回答