C++ 观察内存位置/安装';数据断点';来自代码?

C++ 观察内存位置/安装';数据断点';来自代码?,c++,exception,conditional-breakpoint,C++,Exception,Conditional Breakpoint,我们有一个内存覆盖问题。在程序运行过程中的某个时刻,内存位置被覆盖,导致程序崩溃。该问题仅在释放模式下发生。调试时,一切正常。 这是一个典型的C/C++错误,很难找到 我想知道是否有一种方法可以添加一些“调试代码”来监视这个内存位置,并在其更改后调用回调。这基本上是调试器在调试模式(数据断点)下可以做的事情,但我们在发布版中需要类似的东西。如果您可以控制变量的位置,那么您可以在专用页面上分配它,并设置页面权限,以允许使用(在Windows上…不确定Linux上)进行只读 这样,当有人试图写入时,

我们有一个内存覆盖问题。在程序运行过程中的某个时刻,内存位置被覆盖,导致程序崩溃。该问题仅在释放模式下发生。调试时,一切正常。 这是一个典型的C/C++错误,很难找到


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

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

这样,当有人试图写入时,您将获得访问冲突。使用异常转换器函数,可以将其视为回调


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

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

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


您可能会发现这很有用。

有一些用于此的工具,如堆代理和boundschecker以及许多其他将发现覆盖的工具。基本上,在内存分配结束时,您需要一些Sentinel,需要对它们进行检查。

假设您使用windows使用windbg调试程序并检查ba命令,当访问内存时,这将中断。

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

这将是linux上的mprotect()。(我正要发布同样的东西,但你抢先一步)这是你最好的建议。性能数据断点需要硬件支持才能监视内存范围-如果硬件不支持,则调试器必须单步执行,然后手动检查内存范围是否未更改。将此选项与我提到的调试符号结合使用可获得最佳结果;)这是针对Windows的,尽管我们的项目是跨平台的。它在Windows上崩溃(Windows有一些不同的模块,所以它显然在Windows上)。无论如何,谢谢大家!我们会努力的