1

在我的代码中,我有一个内容完全是垃圾的对象。我猜在代码的其他部分发生了错误的写入,并且(不)运气它在我提到的对象的地址处写入。

我想知道是否有一些工具可以告诉我内存地址收到的每一次写入,这样我就可以跟踪这个错误的来源。

4

3 回答 3

4

大多数调试器都支持写断点。

例如,在 Visual Studio 中,您必须在调试器中启动您的应用程序,中断(在接近可疑变量初始化的正常断点上),然后在菜单中转到“调试/新断点/新数据断点”。

在 SoftIce 中,您可以使用 BPM 命令。:) 那一个也可以打破内存访问。

于 2012-04-06T03:53:42.410 回答
0

根据您的平台,您应该能够使用VirtualProtect之类的东西来锁定该内存区域(我认为它是 linux 上的 mprotect)。这样,当内存区域访问不正确时,您将获得访问违规/段错误。当您获得访问违规/段错误时,您可以在调试器中捕获它们。

但是,要锁定内存区域,通常区域应该与内存页面对齐(至少在 Windows 上),这可能是一个问题。

除此之外,您可以在调试器中使用数据断点。

于 2012-04-06T03:49:04.950 回答
0

如果您使用的是 Windows,则可以使用全局标志(gflags.exe,Windows 调试工具的一部分)并打开 PageHeap。(在“图像”选项卡上,键入 .exe 的名称,然后当它出现时单击“启用页面堆”复选框。)然后运行您的程序。

完成后请记住再次将其关闭。

于 2012-04-06T05:20:41.560 回答