从代码中观察内存位置/安装“数据断点”?

时间:2009-11-06 17:16:43

标签: c++ exception conditional-breakpoint

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

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

5 个答案:

答案 0 :(得分:10)

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

这样,当有人试图写入时,您将获得访问冲突。使用异常翻译功能,您可以将其视为回调。

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

答案 1 :(得分:7)

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

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

您可能会发现此link有用。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

有这样的工具 - 比如堆代理和boundschecker以及许多其他会发现覆盖的工具。基本上,在内存分配结束时需要一些哨兵,需要检查它们。

答案 4 :(得分:0)

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