Как я могу поймать C # AppCrash из-за сбоя родной C ++ DLL

У меня есть DLL, созданная из родного C ++ (скажем, XYZ.dll). Я ссылаюсь на эту DLL в оболочке, которая является C ++ .NET. Объект этой обертки используется в моем коде C # высшего уровня.

Мой вопрос: иногда происходит сбой функции в моей DLL, и мой код C # самого высокого уровня падает с AppCrash; аварийный модуль: XYZ.dll. Я пытаюсь понять, где происходит сбой моего родного кода на C ++, но это оказывается бесплодным. Мне было интересно, есть ли способ для меня, чтобы поймать этот сбой в моем коде C # и двигаться дальше.

2

Решение

Я не думаю, что это ответ, который вы ищете, но, по крайней мере, это поможет устранить проблему. Проверьте AppDomain.UnhandledException … вы должны быть в состоянии перехватить и записать трассировку стека.

1

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

Это то, что вы отлаживаете в Visual Studio? Если нет, рассмотрите возможность установки отладчиков Windows и запустите ваше приложение под cdb.exe. Убедитесь, что у вас есть символы (.pdb) для вашего неуправляемого компонента. Если вы запускаете свое приложение в отладчике (будь то Visual Studio или cdb / windbg) и можете воспроизвести сбой, то вы сможете получить трассировку стека. А поскольку вы подразумеваете, что владеете неуправляемой библиотекой, могу ли я предположить, что у вас есть источники? Если вы в VS, то обязательно отключите параметр Debug Just My Code. Если вы находитесь в windbg, то в точке сбоя должна отображаться ваша трассировка стека, как только вы нажмете исключение первого шанса.

0

Вы можете определенно «поймать» эту аварию.

В вашем C ++ .NET Wrapper / Handler оберните все вызовы в стороннюю DLL, оберните все вызовы с помощью блоков C ++ try / catch. Это должно работать более чем вероятно.

Если это не так, переключитесь на использование структурированной обработки исключений Windows. Это будет ловить собственные исключения Win32 и убивать их мертвых. Вы можете найти документы по Win32 на этом Вот.

0
По вопросам рекламы [email protected]