Сторонний dll разрушает программу без выданного исключения

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

6
задан Mogsdad 18 September 2015 в 19:40
поделиться

4 ответа

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

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

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

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

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

21
ответ дан 8 December 2019 в 03:51
поделиться

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

3
ответ дан 8 December 2019 в 03:51
поделиться

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

3
ответ дан 8 December 2019 в 03:51
поделиться

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

0
ответ дан 8 December 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: