VS 2010中的C++调试访问冲突

C++ Debugging Access Violation in VS 2010

本文关键字:调试 访问冲突 C++ 中的 2010 VS      更新时间:2023-10-16

我是Visual Studio的新手,在VS 2010 C++项目中遇到访问冲突错误。访问违规错误有时指向"free.c"微软文件,有时指向项目代码片段。问题是,代码不是我的,但我必须在其中实现一两件事。所以问题是:如何追踪访问违规的根源代码?

只要有人感兴趣:我正在使用OSG和Qt,试图创建新的线程来在后台运行OSG渲染。在一个简单的例子中(只有3d模型+qt按钮),一切都很好,但当我试图将qt按钮实现到项目中时,它总是给我访问违规

感谢您抽出时间!

编辑:

  • 这是黄色箭头指向ntdll.dll的地方!77972c39()
  • [下面的帧可能不正确和/或丢失,没有为ntdll.dll加载符号]
  • kernel32.dll!7776c3d4()
  • 这是绿色箭头指向msvcr100.dll的地方!自由(无效*pBlock)线路51 C
  • osg75-osg.dll!52f245f1()
  • osg75-osg.dll!52f2785e()
  • osg75-osgQtd.dll!osgQt::QGraphicsViewAdapter::assignImage(unsigned int i)行565+0x59字节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)第89行+0x3b字节C
  • msvcr100.dll!运算符new(unsigned int size)第59行+0x8字节C++
  • osg75-osg.dll!52eac085()
  • 。。打电话给osg dll之类的

同时发现,问题不仅出现在我试图创建新线程的时候,而且出现在其他各种情况下(即使我试图向根组添加一些东西),所以我真正需要的是找出导致访问违规的原因

是否有可能将Debug和Release混合在应用请记住,在中使用Release dll通常是不安全的自Visual Studio发布堆和调试堆不兼容。

多亏了Drescherjm,这就是解决方案。

听起来像是一个无效的指针。发生这种情况时,首先要做的是在堆栈中向上移动,直到您进入项目代码(您通常可以假设"免费"之类的东西运行良好),这可能会指示哪个指针出错。除此之外,它还想知道它是如何获得无效值的。

当然,情况可能会更糟。访问违规几乎是一种通用的"某些错误"类型;例如,一个无效的指针也可以通过一些代码破坏随机内存并命中该指针来创建。这使得很难找到罪魁祸首,因为它从未真正寻址指针。如果它确实"可靠"地命中了指针,您可以尝试在指针上设置一个数据修改断点,每当修改数据时,断点就会中断。

当然,可能还有很多其他的问题。没有简单的"点击这里,点击那里,它告诉你那条断了的线"。