Нарушение прав доступа для отладки C ++ в VS 2010

Я как бы новичок в Visual Studio, и я получаю сообщение об ошибке нарушения прав доступа в проекте VS 2010 C ++. Ошибка нарушения прав доступа иногда указывает мне на файл microsoft "free.c", иногда на фрагменты кода проекта. Дело в том, что код не мой, но я должен кое-что реализовать в нем. Возникает вопрос: как отследить точный фрагмент кода, в котором коренится нарушение прав доступа?

Просто если кому-то интересно: я работаю с OSG и Qt, пытаюсь создать новый поток для запуска OSG-рендеринга в фоновом режиме. В простом примере (просто 3d-модель + кнопка qt) все работает нормально, но когда я пытаюсь внедрить кнопку Qt в проект, она постоянно дает мне нарушение прав доступа

Спасибо за уделенное время!

Редактировать:

  • сюда указывает желтая стрелка ntdll.dll! 77972c39 ()
  • [Фреймы ниже могут быть неправильными и / или отсутствующими, символы для ntdll.dll не загружены]
  • kernel32.dll! 7776c3d4 ()
  • сюда указывает зеленая стрелка msvcr100.dll! free (void * 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 (размер целого числа без знака) Строка 89 + 0x3b байт C
  • msvcr100.dll! оператор new (размер целого числа без знака) Строка 59 + 0x8 байт C ++
  • osg75-osg.dll! 52eac085 ()
  • ..бла-бла, вызов DLL-файлов osg и т. д.

Тем временем выяснилось, что проблема возникает не только тогда, когда я пытаюсь создать новый поток, но и в нескольких других различных ситуациях (даже когда я пытаюсь добавить что-то в корневую группу), поэтому мне действительно нужно уловить, что вызывает нарушение доступа


person Kilazi    schedule 18.09.2012    source источник
comment
Можете выложить стек, когда он вылетает?   -  person i_am_jorf    schedule 18.09.2012
comment
добавлен стек вызовов, если вы это имели в виду, пожалуйста, посмотрите   -  person Kilazi    schedule 18.09.2012
comment
Есть ли шанс, что вы смешиваете отладку и выпуск в одном приложении? Помните, что обычно небезопасно использовать библиотеки DLL выпуска в приложении отладки или библиотеки DLL отладки в приложении выпуска, так как выпуск Visual Studio и куча отладки несовместимы.   -  person drescherjm    schedule 18.09.2012
comment
Не могу поверить, как это было глупо с моей стороны! Это действительно сработало, большое спасибо, Dresherjm. Если вы опубликуете его как ответ, я проголосую за него как за решение   -  person Kilazi    schedule 19.09.2012


Ответы (2)


Есть ли вероятность, что вы смешиваете отладку и выпуск в одном приложении? Помните, что обычно небезопасно использовать библиотеки DLL выпуска в приложении отладки или библиотеки DLL отладки в приложении выпуска, так как выпуск Visual Studio и куча отладки несовместимы.

Так что это было решение, спасибо Drescherjm.

person Kilazi    schedule 21.09.2012

Похоже на недействительный указатель. Когда это происходит, первое, что нужно сделать, это подняться по стеку до тех пор, пока вы не войдете в код проекта (обычно вы можете предположить, что такие вещи, как «бесплатный», работают нормально), что может дать вам указание на то, какой указатель испорчен. Помимо этого, он выясняет, как могло быть получено недопустимое значение.

Конечно, могло быть намного хуже. Нарушения доступа - это в значительной степени общий тип «некоторой ошибки»; недопустимый указатель, например, также может быть создан некоторым кодом, удаляющим случайную память и попаданием в этот указатель. Очень сложно найти виновника, поскольку он никогда не обращается к указателю. Если кажется, что указатель попадает «надежно», вы можете попробовать установить точку останова для изменения данных на указателе, которая прерывается всякий раз, когда эти данные изменяются.

Конечно, может быть много других проблем. Нет простого "щелкни здесь, щелкни там, и он скажет вам, что линия разорвана".

person Christian Stieber    schedule 18.09.2012
comment
спасибо, я думаю, я понял вашу точку зрения. Просто надеялся, что есть какой-то типичный способ отладки, или, может быть, моя ситуация покажется кому-то знакомой. - person Kilazi; 18.09.2012