Отладка доступа к C ++ в VS 2010

Я новичок в Visual Studio и получаю сообщение об ошибке Access Violation в проекте 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 (без знака 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 (беззнаковый размер int) Строка 89 + 0x3b байт C
  • msvcr100.dll! оператор new (беззнаковый размер int) Строка 59 + 0x8 байт C ++
  • osg75-osg.dll! 52eac085 ()
  • ..бла-бла, вызывающий osg dlls и прочее ..

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

1

Решение

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

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

Конечно, может быть много других проблем. Нет простого «кликни сюда, кликни там, и он скажет тебе, что линия сломана».

2

Другие решения

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

Так что это было решение, благодаря Drescherjm.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector