Сторонняя программа аварийного завершения dll без исключения - PullRequest
6 голосов
/ 27 июля 2010

Я использую Visual Studio 2010 и пишу на C #. У меня есть сторонний dll, который я использую в своем проекте. Когда я пытаюсь использовать определенный метод, в случайных, казалось бы, случаях программа просто падает, без исключения. Сессия просто заканчивается. Могу ли я отследить, что происходит?

Ответы [ 4 ]

21 голосов
/ 27 июля 2010

Способ размещения стека для потока в Windows выглядит следующим образом (примерно; это не точное описание всего, что происходит, просто достаточно, чтобы дать вам представление. И способ, которым CLR обрабатывает страницы стека,несколько отличается от того, как неуправляемый код также обрабатывает его.)

В верхней части стека находятся все выделенные вами страницы.Затем появляется «страница защиты» - если вы нажмете эту страницу, страница защиты станет новой страницей стека, а следующая страница станет новой страницей защиты.Тем не менее, последняя страница стека является особенной.Если вы нажмете его один раз, вы получите исключение переполнения стека.Если вы нажмете дважды , тогда процесс будет остановлен немедленно .Под «немедленно» я подразумеваю «немедленно» - не исключение, иди прямо в тюрьму, не проходи, не собирай 200 долларов.Операционная система объясняет, что в этот момент процесс глубоко поврежден и, возможно, он стал активно враждебным для пользователя.Стек переполнен, и код, переполняющий стек, может пытаться записать сколь угодно много мусора в память.(*)

Поскольку этот процесс потенциально представляет опасность для себя и других, операционная система отключает его, не позволяя выполнять больше кода.

Я подозреваю, что что-то в вашем неуправляемом кодедважды попадает на последнюю страницу стека.Почти каждый раз, когда я вижу, что процесс внезапно исчезает без каких-либо исключений или других объяснений, потому что была запущена страница стека «Не связывайся со мной».

(*) В начале 1990-х я работал над драйверами баз данныхдля маленькой операционной системы под названием NetWare.У него не было такого рода средств защиты, которые обычно используются в более современных операционных системах.Мне нужно было иметь возможность динамически «переключать стеки» при работе на уровне защиты ядра;Я знал, когда мой драйвер случайно сорвал стек, потому что он в конечном итоге записал бы в экранную память, и тогда я мог отладить проблему, посмотрев, какой мусор был записан прямо на экран.Ах, это были дни.

3 голосов
/ 27 июля 2010

Вы проверили Журнал событий Windows ? Вы можете получить к нему доступ в меню Инструменты администратора> Просмотр событий. В частности, проверьте журналы приложений и системы.

3 голосов
/ 27 июля 2010

Попробуйте заставить отладчик перехватывать даже обработанные исключения, особенно такие, как «Нарушение доступа» и «Переполнение стека». Вы можете сделать это в Debug -> Exceptions. Возможно, что сторонняя DLL перехватывает все исключения и затем вызывает exit () или что-то похожее, что завершает работу всей программы.

0 голосов
/ 29 июля 2010

Если ваша сторонняя DLL-библиотека управляется, используя Runtime Flow (разработанный мной), вы можете увидеть, что происходит внутри нее до сбоя - переполнение стека, принудительный выход или исключение.четко идентифицируемый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...