Автоматизация тестирования драйвера Win32

Финализаторы необходимы для гарантии выпуска дефицитных ресурсов назад в систему как дескрипторы файлов, сокеты, объекты ядра, и т.д. Так как финализатор всегда работает в конце жизни объектов, it’s обозначенное место для выпуска тех дескрипторов.

Dispose шаблон используется для обеспечения детерминированного разрушения ресурсов. Так как .net сборщик "мусора" во время выполнения недетерминирован (что означает, что Вы никогда не можете быть уверены, когда время выполнения соберет старые объекты и назовет их финализатор), метод был необходим для обеспечения детерминированного выпуска системных ресурсов. Поэтому, когда Вы реализуете Dispose шаблон правильно, Вы обеспечиваете детерминированный выпуск ресурсов и в случаях, где потребитель небрежен и не располагает объект, финализатор очистит объект.

А простым примером того, почему Dispose необходим, мог бы быть быстрый и грязный метод журнала:

public void Log(string line)
{
    var sw = new StreamWriter(File.Open(
        "LogFile.log", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None));

    sw.WriteLine(line);

    // Since we don't close the stream the FileStream finalizer will do that for 
    // us but we don't know when that will be and until then the file is locked.
}

В вышеупомянутом примере, файл останется заблокированным, пока сборщик "мусора" не назовет финализатор на эти StreamWriter объект. Это представляет проблему с тех пор, тем временем, метод можно было бы назвать снова для записи журнала, но на этот раз он перестанет работать, потому что файл все еще заблокирован.

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

public void Log(string line)
{
    using (var sw = new StreamWriter(File.Open(
        "LogFile.log", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))) {

        sw.WriteLine(line);
    }

    // Since we use the using block (which conveniently calls Dispose() for us)
    // the file well be closed at this point.
}

BTW, технически финализаторы и деструкторы означают то же самое; я действительно предпочитаю называть c# деструкторы 'финализаторами' с тех пор иначе, они имеют тенденцию путать людей с деструкторами C++, которые в отличие от C#, детерминированы.

11
задан Dale 25 October 2009 в 09:59
поделиться

5 ответов

Мне кажется, что программное обеспечение виртуализации + метод « имитация объектов » (многоуровневый) (как предлагает Аарон Дигулла) + скрипты (как предлагает Сергиус) могут упростить разработку драйверов устройств.

Но если вы используете Visual Studio для разработки приложений на уровне пользователя, вы также можете использовать его для разработки драйверов устройств ядра с VisualDDK (+ VirtualKD для отладки через именованный канал, что быстрее, чем через виртуальный COM-порт), что конкретно устраняет упомянутые вами неудобства; со своей домашней страницы:

... Этот проект приносит простоту и удобство приложения Windows от разработки до разработки драйвера Мир. Больше не нужно создавать вручную скрипты сборки, копирование драйвера файлы, установка драйверов из INF, переключение между WinDbg и редактор исходного кода или ожидание секунд после каждого шага из-за сверхмедленного виртуальный COM-порт. Просто создайте драйвер проект с помощью удобного драйвера Мастера, выберите виртуальную машину и наслаждайтесь отладкой вашего драйвера напрямую из Visual Studio. Хотите протестировать менять? Просто обычно нажимайте Shift-F5, измените драйвер, перестройте его и запустить снова . VisualDDK выгружается старый драйвер, установите новый и загрузите его автоматически и быстро. Надоело WinDbg загружать файлы символов минут и поиск символов для секунды? Просто позвольте VisualDDK оптимизировать это для вас, используя собственный DIA на основе символ двигателя. Использование C ++ / STLPort в ваши драйверы? VisualDDK изначально будет визуализировать все контейнеры STL и строки, как и Visual Studio для приложений пользовательского режима. ...

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

Следуйте совету, который я дал здесь . По сути, тестируйте как можно меньше с реальной системой.

В вашем случае у меня есть еще один совет: Virtual PC использует виртуальный жесткий диск (это, вероятно, файл на вашем реальном жестком диске).

Вы не нужно устанавливать драйвер, вы можете просто заменить новые файлы на виртуальном жестком диске. Часто это невозможно в работающей системе, но в виртуальной системе вы можете открыть файл виртуального диска и изменить его (поскольку Windows не блокирует файлы в нем).

Я не уверен насчет Virtual PC, но другие эмуляторы поставляются с инструментами для работы с образами виртуальных дисков. Если VPC не может этого сделать, попробуйте VirtualBox .

4
ответ дан 3 December 2019 в 04:52
поделиться

Вы можете написать несколько сценариев оболочки (с использованием sc.exe и devcon.exe) для автоматизации задач развертывания (без открытия диспетчера устройств, нажатия на кнопки и т. Д.). И сделайте снимок системы, готовый к отладке (не дожидаясь загрузки системы).

Не забудьте проверить драйвер с помощью DriverVerifier!

Пример моего собственного скрипта:)

sc create FsFilter type= filesys binPath= c:\FSFilterDrv.sys
sc start FsFilter
pause
sc stop FsFilter
sc delete FsFilter
6
ответ дан 3 December 2019 в 04:52
поделиться

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

Я также настраиваю все свои тестовые машины на автоматический вход в систему ( AutoAdminLogon), подключите сетевые диски и запустите соответствующую командную строку после запуска. В таком случае для запуска конкретного теста нужно ввести только одну команду.

Одно слово о VirtualPC: VirtualPC очень удобен для разработки в режиме ядра, но не забывайте, что он эмулирует только однопроцессорную машину - поэтому обязательно также регулярно тестируйте код на многопроцессорной машине. Тем не менее, трюк с VHD может показаться удобным,

3
ответ дан 3 December 2019 в 04:52
поделиться

Думаю, вам поможет утилита DevCon (описанная в этой статье OSR Online ). У вас должна быть возможность настроить командные файлы, которые будут выполнять работу одним щелчком мыши.

Зарегистрироваться на osronline.com можно бесплатно, и вам, вероятно, придется зарегистрироваться, чтобы получить доступ к этой статье. И если вы пишете драйверы, вы ХОТИТЕ зарегистрироваться. Эти парни занимаются этим уже давно, и на этом сайте есть МНОГО действительно полезной информации.

2
ответ дан 3 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

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