Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: KilaziОтветов: 2

Я как бы новичок в 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 и т. д.

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

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

c++visual-studio-2010debuggingaccess-violation

Ответы

Ответ 1 · рейтинг 3 · Kilazi

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

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

Ответ 2 · рейтинг 2 · Christian Stieber

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы