Я использую Visual Studio 2010 и кодирую в C#. У меня есть сторонняя dll, которую я использую в своем проекте. Когда я пытаюсь использовать конкретный метод, в случайных случаях, программа просто сбой, без исключения. Сессия просто заканчивается. Есть ли способ отслеживать, что происходит?Отказоустойчивая программа для сбоев dll без исключения.
ответ
Способ, которым стек для потока выложен в Windows, выглядит следующим образом (грубо говоря, это не точное описание всего, что происходит, достаточно, чтобы дать вам суть. И способ, которым CLR обрабатывает стоп-страницы несколько отличается от того, как обрабатывается неуправляемый код.)
В верхней части стека есть все целевые страницы, которые вы используете. Затем есть страница защиты - если вы нажмете на эту страницу, страница защиты станет новой страницей стека, и следующая страница станет новой страницей защиты. Однако, специальная страница последней. Если вы ударите его один раз, вы получите исключение переполнения стека. Если вы нажмете его дважды, то процесс прекращается немедленно. «Немедленно» я подразумеваю «сразу» - не исключение, прямо в тюрьму, не проходите, не собирайте 200 долларов. Операционная система приводит к тому, что на данный момент процесс сильно болен и, возможно, он стал активно враждебным. Стек переполнена, и код, который переполняет стек, может пытаться записать в память произвольно много мусора. (*)
Поскольку процесс потенциально опасен для себя и для других, операционная система берет его, не позволяя запускать больше кода.
Мое подозрение в том, что что-то в вашем неуправляемом коде дважды ударяет по последней странице стека. Почти каждый раз, когда я вижу, что процесс внезапно исчезает без каких-либо исключений или других объяснений, потому что пострадали страницы стека «Не со мной».
(*) Еще в начале 1990-х годов я работал над драйверами баз данных для небольшой операционной системы под названием NetWare. У этого не было такого рода защиты, которые теперь имеют современные современные операционные системы. Мне нужно было «динамически переключаться на стеки» при работе на уровне защиты ядра; Я знал, когда мой водитель случайно взорвал стек, потому что он в конечном итоге напишет в экранную память, и тогда я смогу отладить проблему, посмотрев, какой мусор был написан непосредственно на экране. Ах, это были дни.
Попробуйте заставить отладчик поймать даже обработанные исключения - особенно плохие, такие как Нарушение доступа и Переполнение стека. Вы можете сделать это в Debug -> Exceptions. Возможно, что сторонняя DLL ловит все исключения, а затем вызывает exit() или некоторую подобную красоту, которая завершает работу всей программы.
Я установил его так, чтобы были выбраны исключения StackOverflow и AccessViolation, но опять же ничего не выбрасывается. – sbenderli
У вас есть символы отладки, доступные для этой DLL? На каком языке написана DLL? Является ли это управляемой или неуправляемой DLL? Вы также можете просто попытаться проверить все в окне исключений и подождать :) –
Это межсетевая dll. В нем говорится, что первичная сборка Interop также устанавливается в глобальный кэш сборок (GAC), если у вас установлена платформа .NET. Означает ли это, что это управляется? – sbenderli
Вы проверили Журнал событий Windows? Вы можете получить доступ к этому в меню «Инструменты администратора»> «Просмотр событий». В частности, проверьте журналы приложений и систем.
Ничего в журналах :( – sbenderli
Если ваша сторонняя dll управляется, используя Runtime Flow (разработанный мной), вы можете видеть, что происходит внутри нее перед сбоем - переполнение стека, принудительный выход или исключение будут четко идентифицироваться.
- 1. Синхронизация() DLL зависает без ошибок и сбоев
- 2. Программа сбоев общих настроек
- 3. Программа анимационных сбоев COCOS2D
- 4. Программа сбоев при запуске
- 5. Каким образом программа python может завершиться без исключения исключения?
- 6. Java-программа зависает на executeUpdate без исключения
- 7. Программа сбоев после ввода строки
- 8. Программа сбоев при вызове connect()
- 9. Java: программа не сбой после исключения исключения
- 10. Бесконечная петля без сбоев
- 11. Отказоустойчивая аутентификация и авторизация
- 12. Может ли C-программа обрабатывать исключения C++?
- 13. Поиск segfaults без сбоев
- 14. Обработка исключения, вызванного изнутри dll
- 15. Устранение сбоев dll, которое обращается к другой dll
- 16. Несколько проектов C++ .lib для проектов .dll, сбоев Lua!
- 17. MFC DLL вызывает приложение AfxWinInit и сбоев
- 18. Первая программа исключения
- 19. Программа добавления дополнительных сбоев большого числа
- 20. Программа проверки зависимостей DLL
- 21. Многопоточная программа сбоев по запросам HTTPS
- 22. Android - Отслеживание сбоев сборки/исключения/ANRs
- 23. Программа сортировки по последовательности сбоев программы
- 24. Указатели C++ - программа синтаксиса и сбоев
- 25. C++ - программа аварийных сбоев zlib uncompress
- 26. Программа сбоев с Qt QAbstractTableModel :: index
- 27. Windows writeFileEx и recvfrom Программа сбоев
- 28. Обнаружение сбоев вызываемых DLL, вызванных из .NET.
- 29. Исключить исключение из Crashlytics без сбоев?
- 30. Отказоустойчивая обработка флагов SqlAlchemy
Самая типичная причина, по которой программа просто выходит из строя, нет сообщения об ошибке или ничего, является переполнением стека. В этом случае программа не имеет достаточного количества стека для представления самого сообщения об ошибке, и Windows просто завершает его. Может ли это так? –
Я установил VS так, чтобы он выбрал исключения StackOverflow и AccessViolation в соответствии с комментарием dark_charlie.но ничего не происходит – sbenderli