Нарушение доступа в режиме отладки, но нормально в режиме выпуска - PullRequest
0 голосов
/ 15 февраля 2012

Я работаю над этой проблемой в течение двух дней, и это сводит меня с ума, так как я все еще плохо знаком с C ++.Эта проблема с нарушением прав доступа может быть довольно простой для вас, и на нее можно ответить тысячи раз.Но из-за недостатка знаний C ++ я даже не могу определить ту же проблему, на которую когда-либо отвечали.

Хорошо, вот моя проблема:

1. Основной код находится вDLL.Я использую Visual Studio 2008

2. Эта DLL-библиотека называется 3 внешними библиотеками: boost, tinyXML и SRILM (инструментарий NLP).

3. Ошибка говорит: Unhandled exception at 0x5f4f068f (TextNormalizerAPI.dll) in tester.exe: 0xC0000005: Access violation reading location 0x00000000., произошла только в режиме отладки.И строка ошибки была вызвана инициализацией объекта boost :: regex (patUsername = regex("^\\W*@[A-Za-z]");) в моем коде, но фактическая позиция была глубоко внутри библиотеки boost, как показано на рисунке ниже:

The error occurred in boost lib, not in my code

** в большинстве случаев я не должен менять исходный код Boost lib, не так ли?**

4. Эта ошибка произошла только в версии отладки, а не в версии выпуска.

5. Я заменяю все решение настарая, но безошибочная версия, которая правильно работала в режиме отладки.Тем не менее, сразу после создания версии выпуска этого решения в режиме отладки произошла ошибка!

ОБНОВЛЕНИЕ:

6. Спасибо, ребята!Я только что попробовал и обнаружил, что даже простое определение объекта регулярного выражения в первой строке записи DLL приведет к этой ошибке!Есть идеи?

7. пока инициализировать объект регулярного выражения в первой строке в main () вызывающей стороны этого dll не возникнет эта проблема.

Надеюсь, что это описание будетпомочь вам вспомнить что-нибудь и дать мне подсказку.

Я хочу спросить:

Какова обычная стратегия сужения и определения проблемы?спасибо!

Ответы [ 2 ]

3 голосов
/ 15 февраля 2012

Глядя на свой код, вы можете убедиться, что ваши значения m_position являются действительными ... Я вижу метку escape_type_class_jump в вашем коде, поэтому goto или любой другой механизм, который вы используете для переход к этой метке (я не могу сказать по снимку экрана) может быть в обход любых проверок, которые выполняются для проверки того, что ваши приращения позиции все еще действительны.

1 голос
/ 15 февраля 2012

Мне кажется, что "this" (то есть basic_regex_parser) равно NULL, и оно пытается вызвать метод для объекта NULL, который, очевидно, не работает должным образом. Если «this» действительно NULL (вы можете определить это, посмотрев на вкладку «Locals»), то я бы поднял стек вызовов до уровня «basic_regex_implementation» и посмотрел, что там происходит - откуда берется это значение NULL? В целом, полезно рассмотреть различные уровни стека вызовов и значения переменных на этих уровнях.

...