2010-07-27 2 views
5

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

+0

Самая типичная причина, по которой программа просто выходит из строя, нет сообщения об ошибке или ничего, является переполнением стека. В этом случае программа не имеет достаточного количества стека для представления самого сообщения об ошибке, и Windows просто завершает его. Может ли это так? –

+0

Я установил VS так, чтобы он выбрал исключения StackOverflow и AccessViolation в соответствии с комментарием dark_charlie.но ничего не происходит – sbenderli

ответ

19

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

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

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

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

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

3

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

+0

Я установил его так, чтобы были выбраны исключения StackOverflow и AccessViolation, но опять же ничего не выбрасывается. – sbenderli

+0

У вас есть символы отладки, доступные для этой DLL? На каком языке написана DLL? Является ли это управляемой или неуправляемой DLL? Вы также можете просто попытаться проверить все в окне исключений и подождать :) –

+0

Это межсетевая dll. В нем говорится, что первичная сборка Interop также устанавливается в глобальный кэш сборок (GAC), если у вас установлена ​​платформа .NET. Означает ли это, что это управляется? – sbenderli

2

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

+0

Ничего в журналах :( – sbenderli

0

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

Смежные вопросы