2010-07-01 30 views
2

我想用VC++ 6.0调试一个问题。我认为这个问题是在它被释放后访问一个缓冲区的东西,所以我想知道VC++调试器是否有一个漂亮的功能来监视一块内存,并尽快尝试访问它。在VC++ 6.0中调试时,是否可以看到一段内存被访问?

任何想法表示赞赏,因为是:-)

谢谢,山姆非常简单的指令。

回答

0

通过使用getbuffer()/setbuffer()类型的函数来限制对缓冲区的访问。然后在这些函数的开始处的一个断点将让你看到调用堆栈,一旦中断点被击中。从这里你可以知道控制是如何到达那里的。

0

如果您可以控制缓冲区分配和释放的位置,则可以使用VirtualAlloc函数(http://msdn.microsoft.com/en-us/library/aa366887%28v=VS.85%29.aspx)分配缓冲区。为了释放这个内存,你通常会使用VirtualFree(http://msdn.microsoft.com/en-us/library/aa366892%28v=VS.85%29.aspx),但在你的情况下,最好不要释放缓冲区,而是使用VirtualProtect(http://msdn.microsoft.com/en-us/library/aa366898%28v=VS.85%29.aspx)来保护它。使用保护常数PAGE_NOACCESS(请参阅http://msdn.microsoft.com/en-us/library/aa366786%28v=VS.85%29.aspx)。在这次调用之后访问页面的每个人都会遇到访问冲突。

当然,这个技巧假设你不使用千兆字节的缓冲区,因为你可以用这种方式分配的页面数量是有限的(按页表的大小)。

0

Visual Studio可以设置breakpoints on memory。你确实需要知道有问题的内存地址,所以如果你覆盖了堆栈,那就没什么帮助。

相关问题