我们有一个内存覆盖问题。在某些时候,在我们的程序过程中,一个内存位置被覆盖并导致我们的程序崩溃。该问题仅在发布模式下发生。在调试时,一切都很好。这是一个经典的 C/C++ 错误,而且很难找到。
我想知道是否有办法添加一些“调试代码”来监视这个内存位置并在它改变后调用回调。这基本上是调试器在调试模式下可以做的事情(“数据断点”),但我们在发布时需要类似的东西。
我们有一个内存覆盖问题。在某些时候,在我们的程序过程中,一个内存位置被覆盖并导致我们的程序崩溃。该问题仅在发布模式下发生。在调试时,一切都很好。这是一个经典的 C/C++ 错误,而且很难找到。
我想知道是否有办法添加一些“调试代码”来监视这个内存位置并在它改变后调用回调。这基本上是调试器在调试模式下可以做的事情(“数据断点”),但我们在发布时需要类似的东西。
如果您可以控制变量的位置,那么您可以在专用页面上分配它并将页面的权限设置为仅允许使用VirtualProtect读取(在 Windows 上......对于 Linux 不确定)。
这样,当有人尝试写入时,您将遇到访问冲突。使用异常翻译函数,您可以将其视为回调。
即使您不能直接移动变量(例如,它是类成员),也许您可以在变量周围添加足够的填充以确保它位于专用页面上并使用相同的方法。
假设您正在使用 windows 使用 windbg 来调试您的程序并检查 ba 命令 - 这将在访问内存时中断。
有一些工具可以解决这个问题——比如堆代理和边界检查器以及许多其他会发现覆盖的工具。基本上,您在内存分配结束时需要一些哨兵,并且需要对其进行检查。