2012-01-20 1 views
4

У нас есть приложение .NET, которое передает файлы с клиентской рабочей станции в базу данных на центральном сервере в локальной сети. Некоторые из наших клиентов запускают это на беспроводных рабочих станциях Windows XP, которые используют коммерческий сторонний механизм шифрования Wi-Fi (по разным причинам они не используют стандартное шифрование WiFi, такое как WPA). Довольно последовательно, эти рабочие станции синего экрана, когда наше приложение работает.Как отладить сбой BSOD, вызванный косвенно .NET-приложением

Наше приложение напрямую не вызывает неуправляемый код, но, очевидно, что-то, что делает наша программа, косвенно вызывает проблему в базовом сетевом стеке. Я получил файл дампа мини-ядра с одного из зараженных компьютеров и загрузил его в WinDbg, и он сказал мне, что авария, вероятно, была вызвана файлом .sys, который является одним из файлов драйверов для программного обеспечения для шифрования (о котором я уже подозревал). Однако отладчик не сказал мне больше ничего полезного.

Мой вопрос: Есть ли способ получить трассировку стека от точки аварии до нашего приложения .NET? Нужен ли мне полный дамп памяти? У меня есть источник для нашего приложения, но мне мешает тот факт, что a) у меня нет источника или символов для рассматриваемого драйвера; и б) я не испытываю низкоуровневую отладку Windows. Я не против изменять наше приложение, если это необходимо, чтобы избежать проблемных вызовов, если это необходимо, но мне нужно знать, какие вызовы следует избегать.

+5

Приложение .NET не делает ничего плохого. Код режима пользователя не может вызвать BSOD. Вам нужно будет заставить поставщика механизма шифрования WiFi смотреть на дамп. Предположительно, он включает в себя некоторый код режима ядра. –

+0

@JohnSaunders: Я прошу отличить :) https://connect.microsoft.com/VisualStudio/feedback/details/691615/ – leppie

+0

@JohnSaunders: Кроме того, это ядро, а не ядро; p – leppie

ответ

3

Как отмечалось в комментариях, программа usermode не может вызывать блюзовый экран. Только компонент уровня ядра может вызвать BSOD. Скорее всего, происходит то, что ваша программа случайно отправляет данные определенным образом, которые сетевой драйвер не может обрабатывать, и что вызывает BSOD. Это не ваша программа. Все драйверы ядра должны использовать защитные методы программирования. Поэтому, если происходит BSOD, это ошибка драйверов. Это одна из основных особенностей разделения kerenel/usermode. Предполагается, что usermode не может делать все, что может BSOD.

Я понимаю, что приведенный выше совет не всегда помогает, когда вы просто пытаетесь исправить проблему. Поэтому лучше всего было бы открыть дамп в windbg и запустить анализ -v. Это даст вам разумную трассировку стека (для неуправляемого кода), и вы увидите, какой драйвер вызывает эту проблему.

Если вы хотите узнать, какая проблема вызвала проблему, я боюсь вашего SOL. В принципе, невозможно точно знать, какой поток вызвал эту проблему, поскольку, скорее всего, пакет застревал в очереди, а затем обрабатывался позже. К тому времени, когда ящик BSOD'd, поток, который помещает пакет в очередь, уже ушел и сделал другие вещи.

Но если вам повезло, и звезды все выровнены, то, возможно, у вас может быть поток по-прежнему вокруг того же места, где был помещен пакет в очередь, и вы можете увидеть, использует ли windbg с dll SOS.

Разумный помощник для начала работы с управляемой отладки с WinDbg здесь: http://blogs.msdn.com/b/alejacma/archive/2009/07/07/managed-debugging-with-windbg-introduction-and-index.aspx

Это не ответит на все ваши вопросы, но это достойный старт и прибегая к помощи поможет вам большую часть остальной путь ,

+0

Я понимаю, что это не технически наша ошибка, но это по-прежнему (по крайней мере частично) наша проблема. С точки зрения нашего клиента, их рабочие станции имеют синий экран, когда наша программа работает. Они платят нам деньги, поэтому мы сделаем шаг, чтобы исправить это. Похоже, что следующим шагом будет привлечение поставщика шифрования. –

-1

Как правило, это приводит к созданию файла дампа. Загрузите файл дампа в windbg и запустите «анализ -v» и загрузите соответствующий вывод для дальнейшего анализа.

+0

Загрузите его туда, где? –

+0

к этой записи для дальнейшего анализа – steve