Отладчик игнорирует ошибки в динамически загружаемых DLL - PullRequest
3 голосов
/ 28 января 2010

У меня очень странная проблема, связанная с отладкой самокодированных библиотек DLL. У меня есть диалоговое приложение, управляемое MFC, несколько статически связанных проектов и несколько DLL-проектов, которые загружаются во время выполнения.

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

int* i = 0;
*i = 4;

отладчик не выдает никаких ошибок, не выдает никаких исключений и молча возвращается в состояние ожидания, даже если нет (видимых) возвратов стека. Похоже, когда я нажимаю F10 в операторе *i = 4;, элемент управления возвращается в главное окно приложения, и выполнение программы продолжается, поскольку ничего не произошло! И если в коде нет ошибок, он работает нормально. Но я ожидаю ошибок в этом случае! И они есть - в основном коде приложения.

Я использую функцию LoadLibrary () для загрузки моей DLL в приложение. Сама DLL имеет статически связанную MFC, как и любой другой проект в решении.

Есть идеи? Даже не знаю, какой вопрос гуглить ...

Ответы [ 4 ]

1 голос
/ 28 января 2010

Где-то в вашей базе кода есть обработчик исключений, который поглощает исключения. Сначала найдите SetUnhandledExceptionFilter. Также: Отладка + Исключения, Win32 Исключения, отметьте флажок Брошенный.

1 голос
/ 28 января 2010

Скорее всего, вы загружаете DLL с помощью LoadLibrary () из неверного расположения, а отсутствие PDB мешает отладчику установить точку останова. Вы также можете загрузить розничные библиотеки DLL с отключенными утверждениями (если под «ошибками для подтверждения» вы подразумеваете, что в коде есть ASSERT). Если ошибка является ошибкой страницы (как AV, который вы показываете в вашем примере), и ваш отладчик не прерывается, это означает, что исключение обработано. Вы всегда можете включить перерыв при первом удобном случае, например. sxe av. Не уверен, как это сделать с помощью инструмента редактирования кода, но вы всегда можете использовать настоящий отладчик .

0 голосов
/ 29 января 2010

О, оказалось, что проблема вызвана вызовом OpenGL wglMakeCurrent() и возникает только в 64-битной Windows 7 с графической картой NVIDIA GeForce 8800, в то время как в 32-битной Windows Vista все прекрасно работает.

Я задал новый вопрос здесь . Спасибо за ваш отзыв.

0 голосов
/ 29 января 2010

О, похоже, ошибка вообще не связана с DLL. Отладчик ведет себя так же в основном модуле приложения. Я вставил этот фрагмент кода в функцию OnInitDialog () и в функцию-обработчик нажатия кнопки OnBnClickedButton1 ().

В первом случае (когда внутри OnInitDialog ()) возникает исключение, как обычно, и программа не может восстановиться после этой ошибки. В окне вывода отслеживаются следующие сообщения:

Исключение первого шанса в 0x00a3a83e в dmc.exe: 0xC0000005: доступ нарушение письменного местоположения 0x00000000.

Исключение первого шанса в 0x00a3a83e в dmc.exe: 0xC0000005: доступ Нарушение письменного адреса 0x00000000.

Необработанное исключение в 0x00a3a83e в dmc.exe: 0xC0000005: нарушение прав доступа место записи 0x00000000.

Но во втором случае (когда внутри OnBnClickedButton1 ()) исключение не выдается, выполнение OnBnClickedButton1 () прерывается и программа продолжает нормально работать. В окне вывода отслеживаются следующие сообщения:

Исключение первого шанса в 0x00a3c23f в dmc.exe: 0xC0000005: доступ нарушение письменного адреса 0x00000000.

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

Может быть, это поведение контролируется какими-то странными макроопределениями MFC? Или я неумышленно повлиял на это другими настройками?

Извините за ошибки в первой версии проблемы.

...