Система и способ автоматической обработки системных ошибок программного обеспечения

Иллюстрации

Показать все

Изобретение относится к области обработки ошибок, возникающих при работе программного обеспечения. Технический результат настоящего изобретения заключается в повышении эффективности обработки ошибок, возникающих при исполнении кода программы в компьютерной системе. Технический результат достигается за счет автоматизации исследования программного обеспечения в эмулируемой среде исполнения и формирования экспертной системой сценариев обработки определенных в ходе исследования ошибок. Применение изобретения на практике позволяет тестировать программное обеспечение на совместимость с конфигурацией компьютерной системы; определять полный перечень ошибок, которые могут возникнуть при работе программы в различных условиях; выявлять причины возникновения системных ошибок и производить модификацию компьютерной системы для предотвращения возникновения определенной ошибки. 2 н. и 12 з.п. ф-лы, 7 ил.

Реферат

Область техники

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

Уровень техники

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

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

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

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

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

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

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

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

Сущность изобретения

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

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

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

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

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

Изобретение в одном из вариантов реализаций обрабатывает ошибки программного приложения, которое является установщиком программного обеспечения.

Один из предложенных вариантов реализации содержит обработчик ошибок, который дополнительно предназначен для изменения состояния компьютерной системы перед началом исполнения программного приложения с целью предотвращения возникновения ошибки.

Состояние компьютерной системы определяется настройками компьютерной системы, перечнем установленного программного обеспечения, перечнем устройств компьютерной системы, загруженными в память данными, подключениями к сети передачи данных.

В частном варианте реализации эмулятор воспроизводит функции, по меньшей мере, процессора и памяти компьютерной системы.

Один из вариантов реализации содержит эмулятор, который воспроизводит состояние компьютерной системы, изменяя, по меньшей мере, одно возвращаемое значение API-функции операционной системы.

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

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

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

Краткое описание прилагаемых чертежей

Сопровождающие чертежи, которые включены для обеспечения дополнительного понимания изобретения и составляют часть этого описания, показывают варианты осуществления изобретения и совместно с описанием служат для объяснения принципов изобретения.

Заявленное изобретение поясняется следующими чертежами, на

которых:

Фиг.1 показывает схему исполнения приложения на компьютерном устройстве.

Фиг.2 показывает схему исполнения приложения в эмуляторе.

Фиг.3 показывает структурную схему эмулятора.

Фиг.4 показывает блок схему алгоритма работы эмулятора.

Фиг.5 показывает функциональную схему системы автоматической обработки системных ошибок.

Фиг.6 показывает алгоритм работы системы автоматической обработки системных ошибок.

Фиг.7 показывает пример компьютерной системы общего назначения.

Описание предпочтительных вариантов осуществления

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

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

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

В зависимости от функционала программы установщик может проверять различные технические требования, предъявляемые пользовательской системе, которые выражаются в виде определенных условий. В качестве примера набор условных проверок состоит из:

- проверки доступа для записи/чтения необходимого программе файла;

- проверки наличия необходимого свободного места на диске;

- проверки наличия необходимых для функционирования библиотек, интерпретаторов;

- проверки соответствия характеристик процессора, памяти и видеоконтроллера требованиям ПО к вычислительным ресурсам;

- проверки доступности удаленного ресурса по сети передачи данных;

- проверки любого другого параметра системы.

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

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

Пример использования кодов ошибок в коде программы показан ниже. Ошибка может возвращаться различными операторами, в том числе в виде кодов возврата функции.

Примеры (кодов ошибок) для Adobe Flash Player:

Для хранения ошибок часто используются глобальные переменные, например в языке Си ошибки хранятся в переменной «errno»:

Если рассмотреть работу операционной системы семейства Windows, то в большинстве функций используются именно коды ошибок. Другим применяемым способом оповещения об отказе являются вызовы исключений. Исключения используются в тех случаях, когда состояние данных, устройств ввода-вывода или компьютерной системы в целом делает дальнейшее выполнение программы невозможным или бессмысленным. Каждое исключение может быть обработано с возвратом, когда программа исправляет ошибку и продолжает функционирование, или без возврата, передавая управление другому предопределенному модулю программы.

Большинство современных языков программирования, таких как С++, Delphi, Objective-C, Java, Ruby, Python, PHP, все языки платформы .NET и др. имеют встроенную поддержку структурной обработки исключений. В этих языках при возникновении исключения, поддерживаемого языком, происходит раскрытие стека вызовов до первого обработчика исключений подходящего типа и передача управления обработчику.

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

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

Очень часто возникает необходимость в определении списка обрабатываемых ошибок и исключений уже в скомпилированной программе. Данная задача может быть особенно актуальна для поддержки плохо документированных приложений, для тестирования программ и обеспечения безопасности. Более того, производители программного обеспечения не всегда указывают полный список возможных ошибок и редко описывают причины возникновения ошибки и возможные способы их исправления и предотвращения.

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

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

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

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

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

Компьютерной программой называется совокупность последовательности команд, предназначенных для управления устройствами компьютерной системы с целью реализации определенного алгоритма, и данных, используемых при выполнении этих команд. В зависимости от выбранной парадигмы программирования программа может быть выражена в объектной форме или в виде исходного кода. От этого непосредственно зависит процесс запуска и исполнения.

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

В случае, когда программа предварительно откомпилирована и хранится на диске в виде исполняемого файла или набора файлов, процесс загрузки является более быстрым и заключается в переносе образа программы с диска в оперативную память компьютера. Исполняемым файлом (executable file) называется файл, который может быть загружен в память загрузчиком операционной системы и затем исполнен. В операционной системе семейства Windows исполняемые файлы, как правило, имеют расширения ".ехе" и ".dll". Расширение ".ехе" имеют программы, которые могут быть непосредственно запущены пользователем. Расширение ".dll" имеют так называемые динамически связываемые библиотеки (dynamic link libraries). Эти библиотеки экспортируют функции, используемые другими программами. Для того чтобы загрузчик операционной системы мог правильно загрузить исполняемый файл в память, содержимое этого файла должно соответствовать принятому в данной операционной системе формату исполняемых файлов. В современных операционных системах существует множество различных форматов исполняемых файлов. Рассмотрим в качестве примера программу, написанную и скомпилированную для исполнения в операционной системе семейства Windows. Формат Portable Executable (РЕ) - это основной формат для хранения исполняемых файлов и библиотек в операционной системе семейства Windows. Части программ могут компилироваться независимо в отдельные объектные файлы, которые затем объединяются компоновщиком в один исполняемый файл. Исполняемый файл описываемого формата имеет определенную спецификацию. РЕ-файл начинается с заголовков, за которыми располагаются несколько секций. Секция в РЕ-файле представляет либо код, либо некоторые данные и имеет набор атрибутов, задающих ее свойства. Исполняемый файл всегда содержит, по крайней мере, одну секцию, в которую помещен исполняемый код. В общем случае РЕ-файл имеет секции кода (text), данных (data), неинициализированных данных (bss), а также динамически распределяемую область памяти при загрузке - кучу (heap) и стек (stack). Каждая секция имеет собственное предназначение, например сегмент кода содержит непосредственно исполняемые инструкции.

На Фиг.1 показана схема исполнения приложения на компьютерном устройстве, содержащем память и процессор. Приложение, которое может иметь различный функционал, в том числе являться установщиком ПО, представлено на схеме в виде исполняемого файла 100. В других вариантах реализации файл 100 приложения может быть неисполняемым, и для его воспроизведения потребуется дополнительно компилятор или интерпретатор. Исполняемый файл 100 приложения хранится на диске 27 или на другой внешней памяти.

Запуск программ в операционных системах 111 обрабатывает специальный модуль - загрузчик, который создает процесс и потоки, загружает необходимые для начала работы код и данные в память процесса и передает управление приложению. Схема выделения виртуальной памяти 130 описана ниже. Образ РЕ-файла в памяти практически идентичен своему представлению 100 на диске. Данная особенность формата упрощает работу загрузчика, которому достаточно отобразить отдельные части РЕ-файла в адресное пространство процесса, изменить абсолютные адреса в исполняемом коде в соответствии с таблицей релокаций, создать таблицу адресов импорта и затем передать управление на точку входа. В процессе исполнения программы могут потребоваться библиотеки, подгружаемые из каталогов операционной системы или стороннего набора библиотек, ссылки на которые указаны в секции импорта. Таким образом, при запуске программы загрузчик производит следующие действия: считывает заголовки и необходимые секции запускаемого файла 100; загружает в память библиотеки 134, код 132 и данные (ресурсы) 133; выполняет связывание адресов; создает в памяти новый процесс и планирует его к исполнению.

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

По мере исполнения потоков процесса, секции памяти из виртуального адресного пространства 130 загружаются в оперативную память 120. Реальный адрес, по которому размещается секция памяти, скрыт для данного процесса. Неиспользуемые секции переносятся из оперативной памяти 120 на внешнюю память 27 в файл подкачки 140.

Схема исполнения программы в эмуляторе отличается от стандартной схемы и показана на Фиг.2. В представленном варианте реализации компьютерная система дополнена эмулятором 200, который выполнен в виде программы, исполняемой на уровне приложений. В других частных случаях эмулятор может являться частью операционной системы 111 или даже отдельным устройством. Эмулятор 200, загруженный в память 120 компьютерной системы и исполняемый на процессоре 21, осуществляет разбор исполняемого файла 100 и обработку его кода. Характерной особенностью является то, что анализируемое приложение загружается в адресное пространство эмулятора 200. Программная реализация эмулятора позволяет обрабатывать код и ресурсы приложения аналогично процессору 21 и операционной системе 111.

На Фиг.3 показана структурная схема эмулятора 200. Эмулятор 200 компьютерной системы - это средство воспроизведения устройств и программного обеспечения компьютерной системы, взаимодействующее с внешними объектами аналогично компьютерной системе в рамках заданной точности. Предел точности эмулятора - это полное копирование всех программно-аппаратных функций (реализация операционной системы, всех установленных приложений, логики работы всех установленных на компьютере устройств и соединений). В рамках определенного исследования достаточно частичного воспроизведения функционала и состояния компьютерной системы. Для упрощения эмуляции компьютерной системы используют методы для перехвата запросов к объектам компьютерной системы, которые не были эмулированы, для перенаправления запросов реальным объектам компьютерной системы. В одном из вариантов реализации для построения эмулятора, способного исполнить код программы требуется воссоздание процессора 300 и памяти 310. Дополнительно в эмулятор включают файловую систему 320, устройства ввода/вывода 330 и сеть передачи данных 340. В некоторых примерах реализации возможно воспроизведение функций операционной системы и внешних сервисов. Как описывалось ранее, процесс исполняемого файла 311 воспроизводится в адресном пространстве эмулятора, в котором происходит его размещение в воссозданной памяти 310. Для контроля программных инструкций, которые обрабатываются в эмуляторе 200 и при необходимости должны быть переданы на исполнение в реальную среду, выделяется отдельный функциональный блок - обработчик запросов 350. Ход исполнения программы в эмуляторе в виде последовательности выполняемых команд ведется модулем журналирования 360.

Эмулятор 200 в одном из вариантов реализации может быть ограничен обработчиком запросов 350. Таким образом, приложение будет исполняться на реальной компьютерной системе, но все команды приложения будут перехватываться, обрабатываться и записываться в журнал для последующего анализа. Эмуляция в данном случае заключается в подмене результатов некоторых запросов, например результатов вызовов API-функций операционной системы.

Фиг.4 отображает блок-схему алгоритма работы эмулятора 200 для определения полного перечня системных ошибок, которые могут возникнуть в ходе исполнения кода приложения при различных состояниях и конфигурациях компьютерной системы. Начало эмуляции работы программы 400 может быть инициировано рядом событий (в зависимости от интерпретации), среди которых запуск приложения на исполнение; передача приложения (файлов или процесса приложения) на анализ в эмулятор; сохранение в памяти компьютера приложения, которое ранее не анализировалось и другие системные события. Перехват событий, служащих началом эмуляции приложения, может быть реализован, например, внедрением специального драйвера, обрабатывающего вызовы к операционной системе. После того, как код, ресурсы приложения и необходимые библиотеки загружены в эмулятор, приложение начинает выполняться в эмулируемой среде, где каждая инструкция обрабатывается 405 в эмуляторе обработчиком запросов 350 и сохраняется 420 в модуле журналирования 360.

Рассмотрим вариант реализации системы, в котором в качестве условного ветвления выступает вызов API-функции. При перехвате следующей в хронологическом порядке API-функции эмулятор возвращает приложению заведомо ложное значение 410, после чего программа продолжает исполняться до возникновения ошибки (возврата кода определенной ошибки 415). Эмулятор в каждом цикле последовательно возвращает различные коды ошибок в зависимости от спецификации вызываемой функции. Код ошибки и журнал исполнения программы сохраняются 420, а эмуляция переходит к следующему циклу, в котором весь процесс повторяется, но ложное значение возвращается только от следующей API-функции 430. Количество циклов соответствует количеству вызываемых функций с учетом того, что каждая функция может вернуть несколько, различных кодов ошибок. Выход из цикла происходит, когда обработаны все вызовы функций 425. В результате данных манипуляций в журнале создаются записи о кодах ошибок и вызовах функций, значения которых были подменены. Возврат ложного результата функции означает невыполнение одной из команд программы, что приводит к ошибке в работе программы, которую определяет значение кода ошибки. Функция, вызов которой привел к формированию ошибки, трактуется в качестве причины ее возникновения. Полученные результаты составляют экспертные данные, дающие представление об ошибках и вызвавших указанные ошибки причинах 435. Далее определяются инструкции 440 - действия, направленные на обработку ошибки. Например, если причиной возникновения сбоя послужила попытка чтения файла, необходимо проверить его наличие и настроить разграничение прав доступа.

Существует набор функций, перебор и анализ которых не даст результата. Для ускорения исследования программы данные функции пропускаются, тем самым уменьшается количество циклов эмуляции. Перечень функций, которые не несут смысловой нагрузки для выявления причин ошибок, заносятся в специальный список, который может быть в дальнейшем дополнен и модифицирован. Рассмотрим пример трассировки приложения, в котором многие функции не будут влиять на код возвращаемой ошибки. Функция CreateFileW не получила доступ к файлу ebO.tmp, например, потому, что файл используется. После этого выполнилось несколько вызовов функций и финальный вызов ExitProcess с кодом возврата 0×401. Журнал вызовов содержит последовательность вызываемых функций и их результатов, следующих за функциями, возвращаемые значения которых были изменены, и показан ниже:

Подобный подход может оптимизировать анализ функций и еще больше сократить время на выявление возможных ошибок.

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

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

Рассмотрим устройство процессора 300 на примере архитектуры ×86. Каждая архитектура характеризуется набором команд процессора, схемой работы с памятью, таблицей декодирования команд и т.д. Помимо основного набора команд, то есть команд, с помощью которых можно выполнить любую программу, процессоры семейства ×86 имеют расширения в виде специальных возможностей, реализуемых компанией-производителем. К подобным расширениям, как правило, относятся команды оптимизации исполнения инструкций, использование специальных режимов исполнения инструкций и другие.

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

В современных процессорах команды потоков отличаются от операций, которые реализуют исполняющие устройства. Это сделано для упрощения работы исполняющих устройств и увеличения скорости работы процессора. Для преобразования ×86 совместимого кода во внутреннюю систему команд исполняющих устройств используется декодер 301.

Развитие процессорной техники привело к появлению кэша, ускоряющего исполнение программ. Кэш представляет собой временную память, доступ к которой на порядок быстрее, чем чтение данных из ОЗУ (оперативно запоминающее устройство). Когда поток начинает выполняться, загружаемые из процесса ресурсы сохраняются в кэше, перезаписывая в нем устаревшие данные. Далее, перед тем как загрузить данные из ОЗУ, процессор проверяет их наличие в кэше, тем самым экономит время на выполнение программы. В современных процессорах поддерживается многоуровневое кэширование, разделяющее кэш данных, кэш инструкции, смешанный кэш и т.д.

Самой быстрой памятью являются регистры 303, которые располагаются непосредственно в ядре процессора. Пример 32-разрадного процессора содержит восемь регистров общего назначения, которые могут использоваться для хранения данных и адресов, шесть регистров сегментов, регистры состояния и управления и специальные регистры.

Процессор может работать в нескольких режимах. Основными из них являются реальный и защищенный режимы. Переключения между режимами происходят программно. Работа процессора в реальном режиме характеризуется выполнением 16-разрядных команд, 20-разрядной адресацией и незащищенностью адресного пространства одной программы от другой. Современные операционные системы, поддерживающие многозадачность, используют защищенный режим. Новый метод адресации памяти позволяет изолировать адресные пространства отдельных задач друг от друга. При этом прикладная программа, работающая в среде операционной системы, использующей защищенный режим, не может случайно или намеренно разрушить целостность самой операционной системы. В защищенном режиме программа может записывать данные только в те области памяти, которые выделены ей операционной системой. Это повышает надежность работы многозадачных и, в частности, многопользовательских операционных систем. Именно в защищенном режиме возможно страничное управление памятью, которое позволяет поместить часть оперативной памяти на диске. Страничная организация памяти - простая схема повышения эффективности, в соответствии с которой память разбивается на страницы от 512 байт до нескольких килобайт. Соответствующая схема обращения позволяет в пределах страницы уменьшить количество состояний ожидания.

Все потоки процесса выполняются в едином адресном пространстве, выделяемом при создании процесса. В 32 разрядных системах объем памяти, доступной каждому процессу, составляет 4 Гбайт. Верхняя половина этого пространства резервируется за операционной системой, а вторая половина доступна пользовательским приложениям.

Механизм виртуальной памяти позволяет изолировать процессы друг от друга. Потоки одного процесса не могут ссылаться на адресное пространство другого процесса. Виртуальная память 130 может вовсе не соответствовать структуре физической памяти 120. Диспетчер памяти транслирует виртуальные адреса на физические, по которым реально хранятся данные. Поскольку далеко не всякий компьютер в состоянии выделить по 4 Гбайт физической памяти на каждый процесс, используется механизм подкачки (swapping). Когда оперативной памяти не хватает,

операционная система перемещает часть содержимого памяти на диск, в файл (swap file или page file), освобождая таким образом, физическую память для других процессов. Когда поток обращается к странице виртуальной памяти, записанной на диск, диспетчер виртуальной памяти загружает эту информацию с диска обратно в память. Устройство оперативно-запоминающего устройства с точки зрения потоков не различим - достаточно реализовать адресное пространство, функции ввода и вывода информации.

Для эмуляции процессов часто необходимо эмулировать файловую систему, особенно в тех случаях, когда необходимо обезопасить данные на диске или когда доступ к файлам ограничен. Файловой системой называется способ организации, хранения и именования данных на носителях информации. Оперируя объектами данных в виде файлов, операционная система использует файловую систему для размещения файлов на диске и обращения к ним, а также для определения атрибутов файла, разграничения доступа и т.д. С точки зрения ОС весь диск представляет собой набор кластеров. Драйверы файловой системы организуют кластеры в файлы и каталоги. Когда приложение обращается к файлу, файловая система определяет кластеры, в которых хран