Нарушение прав доступа при запуске собственного приложения C++, использующего встроенную DLL /clr.
-
27-09-2019 - |
Вопрос
Я реорганизую устаревшее смешанное приложение (управляемые и неуправляемые библиотеки DLL) так, чтобы основной сегмент приложения был неуправляемым MFC и вызывал C++ DLL, скомпилированную с флагом /clr, который будет связывать управляемый (C# DLL) и неуправляемый код. .К сожалению, мои изменения привели к нарушению прав доступа, которое происходит до вызова приложения InitInstance().Это очень затрудняет отладку.Единственная информация, которую я получаю, — это следующая трассировка стека.
> 64006108()
ntdll.dll!_ZwCreateMutant@16() + 0xc bytes
kernel32.dll!_CreateMutexW@12() + 0x7a bytes
Итак, вот несколько сценариев, которые я попробовал.
— Включены «Исключения» -> «Исключения Win32» -> «c0000005 Нарушение прав доступа» для прерывания при возникновении.Тем не менее, наиболее подробную информацию я получаю из приведенной выше трассировки стека.Я пробовал приложение с помощью F10, но оно терпит неудачу до того, как будут достигнуты какие-либо точки останова, и завершается с ошибкой с приведенной выше трассировкой стека.
- Я удалил DLL моста, чтобы у нее был только один метод, возвращающий логическое значение, и этот метод закодирован так, чтобы просто возвращать false (код C# не вызывается).
bool DllPassthrough::IsFailed() { return false; }
Если заглушка DLL скомпилирована с флагом /clr, приложение завершится сбоем.Если оно скомпилировано без флага /clr, приложение запускается.
- Я создал приложение-заглушку MFC с помощью мастера Visual Studio для многодокументных приложений и вызвал DllPassthrough::IsFailed().Это удается даже с флагом /clr, используемым для компиляции DLL.
- Я попробовал выполнить загрузку библиотеки winmm.lib вручную, как описано в следующей заметке. Нарушение прав доступа при использовании C++/cli.Приложение по-прежнему не работает.
Итак, мои вопросы: как решить проблему?Любые намеки, стратегии или предыдущие инциденты.И если это не удастся, как я могу получить дополнительную информацию о том, какой сегмент кода или библиотека вызывает исключение доступа?Если я попробую более сложные обходные пути, такие как вызовы LoadLibrary, я бы хотел сузить их до неисправных библиотек.
Спасибо.Кстати, мы используем Visual Studio 2008, а проект строится на базе .NET 2.0 для управляемых разделов.
Решение
Я верю, что решу свою проблему.Систематически удаляя каждую ссылку на библиотеку и комментируя вызовы в эту конкретную библиотеку в коде приложения (неуправляем), я в конечном итоге удалил библиотеку проблем и получил программу для запуска.Это грубый способ диагностики проблемы, и, к счастью, мне не пришлось удалять слишком много библиотек, чтобы решить ее.Мне все равно было бы любопытно, есть ли у кого-нибудь комментарий, можно ли было идентифицировать библиотеку с помощью отладчика.
Итак, следующим шагом будет перемещение этих вызовов библиотеки в управляемый код и передача информации обратно неуправляемой стороне через мою мостовую DLL.Кстати, я реинтегрировал winmm.lib в проект, и он все еще работает.