在我的代码中,我有一个对象,其内容完全是垃圾。我想在代码的其他部分发生了错误的写入,而且(运气)它写在我提到的对象的地址上。
我想知道是否有一些工具可以告诉我每次写入内存地址都会收到,所以我可以跟踪这个bug的来源。
答案 0 :(得分:4)
大多数调试器在写入时支持断点。
例如在visual studio中,您必须在调试器中启动应用程序,中断(在接近可疑变量初始化的正常断点上),然后在菜单中转到“Debug / New Breakpoint / New Data Breakpoint”。
在SoftIce中,您可以使用BPM命令。 :)那个人也可以打破内存访问。
答案 1 :(得分:0)
根据您的平台,您应该能够使用类似VirtualProtect的内容锁定该内存区域(我认为它是linux上的mprotect)。这样,当内存区域访问不正确时,您将获得accessviolation / segfault。当你获得accessviolation / segfault时,你可以在调试器中捕获它们。
但是,要锁定内存区域,通常区域应该与内存页面对齐(至少在窗口上),这可能是个问题。
除此之外,您可以在调试器中使用数据断点。
答案 2 :(得分:0)
如果您使用的是Windows,则可以使用Global Flags(gflags.exe,Windows的调试工具的一部分)并打开PageHeap。 (在“图像”选项卡上,键入.exe的名称,然后在显示时单击“启用页面堆”复选框。)然后运行程序。
请记住在完成后再将其关闭。