我有一个带有内存损坏问题的C++程序,目前正在Visual 2013中进行调试。我正在使用g频标志来帮助找出问题所在:
https://blog.kowalczyk.info/article/1j9/gflags-a-debugging-story.html
我有所有的all,该应用程序拉进来,作为g频标志命令行的一部分。
我是一位经验丰富的C++程序员,曾多次处理指针问题。这个对我来说很奇怪。当跟踪开始时,我会写下指针所指向的内存地址,即显示在“监视”窗口中的地址。
当g频标志触发Visual捕获的断点时,我惊讶地发现内存指针仍然指向完全相同的地址。但是,现在监视窗口显示指针指向的内存区域无效(“错误读取字符在.”)。由于被触发的异常是访问冲突(c0000005),我必须假定指针指向的内存被视为“当前进程之外的内存”。我说的原因是,如果只是内存区域被不适当地分配或释放的问题,地址仍然指向当前进程空间中的内存区域,不应该触发访问冲突。它只是指向随机内容。
换句话说,这不是指针地址本身被破坏或覆盖的通常情况,这会导致指针指向当前进程空间之外的内存。指针的原始地址从分配时起不会改变。
是什么原因导致一个指针的内存地址没有改变,并开始指向进程空间中的有效内存,突然指向被认为无效的内存到触发系统访问冲突的程度?另外,尝试调试问题的最佳方法是什么?
发布于 2016-07-06 15:44:03
这个问题被证明是一个线程冲突,一个线程释放一个共享内存缓冲区,而另一个线程仍在使用。由于@dxiv的评论,他纠正了我对非法访问的看法,我找到了这个问题。
我认为(*错误地)*一个指针触发访问冲突的唯一方法是,如果指针本身被破坏,并被设置为位于它的进程空间之外的内存,或者通过分配无效的地址,或者被被意外地覆盖而损坏的指针。相反,正如dxiv所指出的,如果指针所指向的内存被释放(释放)并随后访问指针,也会触发访问冲突。
有了这些新知识和g频标实用程序,我发现第一个线程正在释放共享内存缓冲区,并修复了这个问题。
https://stackoverflow.com/questions/38194980
复制相似问题