VS 2010 中的 C++ 调试访问冲突
Posted
技术标签:
【中文标题】VS 2010 中的 C++ 调试访问冲突【英文标题】:C++ Debugging Access Violation in VS 2010 【发布时间】:2012-09-18 04:37:24 【问题描述】:我是 Visual Studio 的新手,在 VS 2010 C++ 项目中遇到访问冲突错误。访问冲突错误有时将我指向“free.c”微软文件,有时指向项目代码片段。问题是,代码不是我的,但我必须在其中实现一两件事。 那么问题来了:如何追踪访问冲突根源的确切代码段?
如果有人感兴趣:我正在使用 OSG 和 Qt,试图创建新线程以在后台运行 OSG 渲染。在简单的示例中(仅 3d 模型 + qt 按钮)一切正常,但是当我尝试将 Qt 按钮实现到项目中时,它不断给我访问冲突
感谢您的宝贵时间!
编辑:
这是黄色箭头所指的地方 ntdll.dll!77972c39() [下面的帧可能不正确和/或丢失,没有为 ntdll.dll 加载符号] kernel32.dll!7776c3d4() 这是绿色箭头所指的地方 msvcr100.dll!free(void * pBlock) Line 51 C osg75-osg.dll!52f245f1() osg75-osg.dll!52f2785e() osg75-osgQtd.dll!osgQt::QGraphicsViewAdapter::assignImage(unsigned int i) Line 565 + 0x59 bytes C++ osg75-osgQtd.dll!osgQt::QGraphicsViewAdapter::setFrameLastRendered(const osg::FrameStamp * frameStamp) 第 477 行 C++ osg75-osgQtd.dll!osgQt::QWidgetImage::setFrameLastRendered(const osg::FrameStamp * frameStamp) 第 54 行 C++ osg75-osgViewer.dll!545b5a2e() osg75-osgUtil.dll!52c8b6a3() msvcr100.dll!malloc(unsigned int size) Line 89 + 0x3b bytes C msvcr100.dll!operator new(unsigned int size) Line 59 + 0x8 bytes C++ osg75-osg.dll!52eac085() ..blah blah 调用 osg dll 和其他东西..同时发现问题不仅出现在我尝试创建新线程时,而且出现在其他几种情况下(即使我尝试向根组添加某些内容),所以我真正需要的是找出导致访问冲突的原因
【问题讨论】:
当它崩溃时你能发布堆栈吗? 添加了调用栈,如果你是这个意思,请看一下 您是否有可能在同一个应用程序中混合调试和发布?请记住,在调试应用程序中使用发布 dll 或在发布应用程序中使用调试 dll 通常并不安全,因为 Visual Studio 发布和调试堆不兼容。 我不敢相信我这么愚蠢!这确实有效,非常感谢 Dresherjm。如果您将其发布为答案,我会将其作为解决方案投票 【参考方案1】:您是否有可能将 Debug 和 Release 混合在一起 应用?请记住,使用 Release dll 通常并不安全 调试应用程序或发布应用程序中的调试 dll,因为 Visual Studio 发布和调试堆不兼容。
这就是解决方案,感谢 Drescherjm。
【讨论】:
【参考方案2】:听起来像一个无效的指针。发生这种情况时要做的第一件事是上堆栈,直到您进入项目代码(您通常可以假设“免费”之类的东西可以正常工作),这可能会告诉您哪个指针被弄乱了。除此之外,它还在弄清楚它是如何获得无效值的。
当然,情况可能会更糟。访问冲突几乎是一种通用的“一些错误”类型;例如,一个无效的指针也可能是由一些代码破坏随机内存并点击该指针来创建的。很难找到罪魁祸首,因为它从来没有真正解决过指针。如果它看起来确实“可靠”地击中了指针,您可以尝试在指针上设置数据修改断点,该断点会在修改数据时中断。
当然,可能还有许多其他事情出错。没有简单的“点击这里,点击那里,它会告诉你断线”。
【讨论】:
谢谢,我想我明白了。只是希望有一些典型的方法来调试它,或者也许我的情况对某人来说有点熟悉以上是关于VS 2010 中的 C++ 调试访问冲突的主要内容,如果未能解决你的问题,请参考以下文章
C++中的VS2010调试器,“unused=???”的意思或“未使用=0”