Dependency Walker - помощник в разрешении зависимостей |
![]() |
Добавил(а) microsin |
Dependency Walker - бесплатная, свободная утилита, которая сканирует 32-битные и 64-битные исполняемые файлы Windows (exe, dll, ocx, sys и т. п.), и строит диаграмму - иерархическое дерево всех модулей (библиотек), от которых зависит программа. Для каждого найденного модуля выводится список всех функций, которые экспортирует этот модуль, и какие из этих функций реально вызываются другими модулями. Другой вид отображает минимальный набор необходимых файлов вместе с детальной информацией по каждому файлу, включая полный путь до файла, базовый адрес, номера версии, тип машины, отладочную информацию и другие данные. Здесь и далее перевод части документации, доступной на сайте программы [1]. Dependency Walker также очень полезен для разрешения системных ошибок, связанных с загрузкой и выполнением модулей. Dependency Walker детектирует множество общих проблем приложений, такие как отсутствующие модули, ошибочные модули, несоответствие импорта/экспорта (функций), ошибки циклических зависимостей, несоответствие модулей типу машины и отказы инициализации модулей. Dependency Walker работает на Windows 95, Windows 98, Windows Me, Windows NT, Windows 2000, Windows XP, Windows 2003, Windows Vista, Windows 7 и Windows 8. Он может обрабатывать любой 32-битный или 64-битный модуль Windows, включая разработанные для Windows CE. Он может быть запущен как приложение с графическим интерфейсом или как консольное приложение. Dependency Walker поддерживает все типы зависимости модулей, включая неявные implicit, явные explicit (dynamic / runtime), перенаправленные (forwarded), с отложенной загрузкой (delay-loaded) и инжектируемые (injected). В программе имеется подробная подсказка (help). Dependency Walker полностью свободен для использования. Однако Вам нельзя получать доход от его распространения, и нельзя поставлять совместно с другим продуктом. Dependency Walker является частью некоторых продуктов Microsoft, таких как Visual Studio, Visual C++, Visual Basic, Windows 2000/XP/2003 support tools (на Windows CD), Windows 98/NT/2000/XP/2003 Resource Kits, Platform SDK, Windows DDK, Windows SDK и MSDN. Также есть несколько мест на сайте Microsoft, откуда свободно можно загрузить Dependency Walker. Сайт [1] специально разработан для того, чтобы можно было распространять для тестирования последнюю версию Dependency Walker. [Типы зависимостей, обрабатываемых Dependency Walker] Есть несколько вариантов, как один модуль может зависеть от другого модуля: 1. Implicit Dependency, неявная зависимость (также известная как load-time dependency, зависимость времени загрузки или иногда некорректно называемая как static dependency, статическая зависимость): Модуль A неявно связан с библиотечным файлом Модуля B при компилировании/линковке, и исходный код Модуля A реально вызывает одну или больше функций Модуля B. Модуль B является зависимостью времени загрузки для Модуля A, и будет загружен в память независимо от того, что Модуль A на самом деле будет вызывать Модуль B во время выполнения. Модуль B будет перечислен в таблице импорта (import table) Модуля A. 2. Delay-load Dependency, зависимость отложенной загрузки: Модуль A связан по отложенной загрузке (delay-load linked) с библиотечным файлом Модуля B при компилировании/линковке, и исходный код Модуля A в действительности вызывает одну или больше функций Модуля B. Модуль B является динамической зависимостью и будет загружен в память только тогда, когда Модуль A на самом сделает обращение к функциям Модуля B во время выполнения. Модуль B будет перечислен в таблице импорта отложенной загрузки (delay-load import table) Модуля A. 3. Forward Dependency, перенаправленная зависимость: Модуль A связан с библиотечным файлом Модуля B при компиляции/линковке, и исходный код Модуля A реально вызывает одну или больше функций Модуля B. Некоторые из функций, вызываемых в Модуле B, в действительности перенаправляют вызов функции из Модуля C. Модуль B и Модуль C оба являются зависимостями для Модуля A, однако только Модуль B будет перечислен в таблице импорта Модуля A. 4. Explicit Dependency, явная зависимость (также известная как dynamic, динамическая или run-time dependency, зависимость времени выполнения): Модуль A не связан с Модулем B при компиляции/линковке. Во время выполнения Модуль A динамически загружает Модуль B с помощью вызова функции типа LoadLibrary. Модуль B становится для Модуля A зависимостью времени выполнения (run time dependency), но при этом Модуль B не будет перечислен ни в какой таблице Модуля A. Этот тип зависимости является общим для OCX-ов, объектов COM и приложений Visual Basic. 5. System Hook Dependency, зависимость хука системы (также известная как injected dependency, инжектированная зависимость): этот тип зависимости происходит, где другое приложение делает хук (привязку) к специфичному событию (наподобие события от мыши) в процесс. Когда этот процесс создает событие, операционная система может инжектировать модуль в процесс для обработки события. Модуль, который инжектируется в процесс, не является реальной зависимостью для другого модуля, однако он размещается в том же самом адресном пространстве процесса. Dependency Walker полностью поддерживает модули, загружаемые по всем вышеперечисленным техникам. Случаи 1, 2 и 3 могут быть легко выявлены простым открытием модуля в Dependency Walker. Случаи 4 и 5 требуют профайлинга времени выполнения (runtime profiling), эта новая фича появилась в Dependency Walker 2.0. Для дополнительной информации по профилированию обратитесь к секции "Использование профайлинга (Application Profiling) для выявления динамических зависимостей (Dynamic Dependencies)". [Использование профайлинга (Application Profiling) для выявления динамических зависимостей (Dynamic Dependencies)] Начиная с Dependency Walker версии 2.0 добавлен профайлинг приложений - техника, используемая для отслеживания работающей программы, чтобы посмотреть, какие модули она загружает. Это позволяет Dependency Walker выявить динамически загружаемые модули, которые не обязательно будут перечислены в таблицах импорта других модулей. Профайлер Dependency Walker также может детектировать ситуации, когда модуль не может инициализироваться, что часто приводит к ошибке "The application failed to initialize properly" (приложение не может быть правильно инициализировано). Когда модуль впервые открыт в Dependency Walker, он немедленно будет просканирован на все неявные, отложенные и перенаправленные зависимости (подробнее см. секцию "Типы зависимостей, обрабатываемых Dependency Walker"). Как только все модули просканированы, будут отображены результаты. В дополнение к этим известным зависимостям, модули имеют право загружать другие модули во время выполнения без предварительного оповещения об этом операционной системы. Такие типы зависимостей известны как динамические, или явные зависимости. Нет другого способа их обнаружить, кроме как запустить приложение и отследить, какие модули оно загружает во время выполнения. Именно это и делает профайлинг приложений в Dependency Walker. Чтобы профайлинг заработал, открываемый модуль должен быть исполняемым (обычно имеет расширение файла .EXE), разработанным специально для запуска в той системе, в которой Вы запускаете профайлинг через Dependency Walker. Если это условие не соблюдается, то пункт меню Start Profiling и соответствующая кнопка на тулбаре будут недоступны. Когда Вы выбираете профайлинг приложения, Ваше приложение должно начать работу. Как только приложение запустилось и заработало, Dependency Walker захватит нужную информацию и выведет её в область лога (Log View), а также обновит и другие области просмотра в рабочем окне. Работа пользователя состоит в том, чтобы "потренировать" приложение с целью убедиться, что все динамические зависимости найдены. Обычно динамические зависимости загружаются только тогда, когда реально нужны. Например, модули, связанные с печатью, могут быть загружены только когда приложение что-то на самом деле печатает. В случае наподобие этого, если приложение не выполняет действий для печати при профайлинге, то Dependency Walker не обнаружит модули, связанные с печатью. Другие модули могут загружаться, если с приложением произойдет ошибка. Иногда похожие сценарии бывают сложны для воспроизведения, чтобы можно было отследить зависимости. По этой причине нельзя гарантировать, что найдены все динамические зависимости, однако чем больше приложение тестируется, тем больше шансов найти все зависимости. Профайлер приложения Dependency Walker отслеживает каждый загруженный модуль и пытается определить, какой модуль запрашивал загружаемый модуль. Это позволяет динамически загружаемым модулям быть вставленными в вид дерева зависимостей вида (Module Dependency Tree View) как дочерние для того модуля, который на самом деле загрузил модуль. Профайлер работает, цепляя (hooking) некоторые вызовы в профилируемом сетевом процессе (remote process). На Windows 95, Windows 98 и Windows Me могут быть подцеплены только несистемные модули. В результате когда системный модуль динамически загружает другой модуль, профайлер не может указать, какой модуль является родительским для динамически загруженного модуля. Модули без родителя будут добавлены в корневой список Module Dependency Tree View. Все модули, которые были загружены от общесистемного хука, будут также добавлены в корень Module Dependency Tree View, поскольку эти типы модулей загружаются напрямую операционной системой, и не имеют родительского модуля. Даже при том, что Dependency Walker может быть не в состоянии детектировать родителя для динамической зависимости, он может гарантировать, что будут детектированы все модули, загруженные приложением. Одна заключительная польза от профайлера в том, что он может исправить пути любых модулей, которые возможно были неправильно определены при начальном сканировании, когда определяются неявные зависимости. Когда Вы первый раз открываете модуль в Dependency Walker, он рекурсивно сканирует все таблицы импорта и экспорта модулей, чтобы построить начальную иерархию модулей. В этих таблицах сохранены только имена файлов, при этом Dependency Walker использует Вами установленные правила в диалоге порядка поиска модулей (Module Search Order Dialog), чтобы определить полный путь до каждого модуля. Во время профайлинга, Dependency Walker проверяет реальный путь к каждому модулю, который был загружен, и сравнивает с модулями в дереве. Если модуль был загружен по другому пути, чем Dependency Walker ожидал, то он обновит иерархию модулей, и другие области просмотра также отразят эти изменения. [Как интерпретировать предупреждения (Warnings) и ошибки (Errors) в Dependency Walker] Для проверяемого приложения Dependency Walker может генерировать множество предупреждений (Warnings) и сообщений об ошибках (Errors). Некоторые ошибки могут привести к невозможности работы приложения, а другие безобидны и могут быть проигнорированы. Большинство проблем с приложением может быть отнесено к 2 категориям: проблемы при загрузке (load-time failures) и проблемы при работе (run-time failures). Load-time failures означают, что приложение или модуль могут и не запуститься, чтобы начать работу. В технических терминах это обычно означает, что точка входа в модуль не достигнута, потому что операционная система не смогла найти все требуемые модули (зависимости). Это может произойти, если неявная или перенаправленная зависимость не разрешена из-за того, что файлы зависимости не найдены, или в них отсутствует нужная функция (для получения дополнительной информации по типам зависимостей обратитесь к секции "Типы зависимостей, обрабатываемых Dependency Walker"). Вы также получите load-time failure, если приложение попытается загрузить испорченный модуль, модуль не для Windows, модуль для другого типа CPU (отличающегося от того, что Вы используете), или 16-битный модуль в 32-битное приложение. Вот некоторые из сообщений об ошибках времени загрузки (load-time error): • The dynamic link library BAR.DLL could not be found in the specified path ... (динамически загружаемая библиотека не найдена по указанному пути). Большинство проблем времени загрузки могут быть сразу выявлены с помощью Dependency Walker. Когда Вы впервые открываете модуль в Dependency Walker, он сканирует модуль на обнаружение неявных, перенаправленных и отложенных по загрузке зависимостей. Если есть какие-нибудь отсутствующие неявные или перенаправленные зависимости, или есть ошибки, то возможно приложение встретится с проблемами, если будет запущено. Зависимости с отложенной загрузкой не требуются операционной системой во время загрузки приложения, так что ошибки или предупреждения, связанные с зависимостью с отложенной загрузкой возможно и не создадут проблемы. Зависимости времени выполнения - это модули, которые приложение загружает после того, как проинициализировалось и начало работу. Такая загрузка модулей обычно достигается вызовом одной из функций типа LoadLibrary. Как только модуль загружен, приложение делает вызов функции GetProcAddress, чтобы найти нужную функцию в только что загруженном модуле. Dependency Walker может отследить все эти вызовы и сообщить от любых проблемах. Однако, если приложение написано таким образом, чтобы обработать эти проблемы, то предупреждения Dependency Walker можно проигнорировать. Есть несколько причин использовать зависимости времени загрузки. Во-первых, это может ускорить загрузку приложения, поскольку приложение может отложить загрузку определенных модулей, которые пока не нужны. Например, если приложение использует DLL для печати, то DLL может не загружаться, пока Вы не будете что-то печатать из приложения. Во-вторых, это может использоваться в случаях, когда модуль или функция в модуле могут отсутствовать. Например, приложение может нуждаться в вызове специфичной для Windows NT функции, когда работает на Windows NT, но этот модуль или функция не существуют на Windows 9x. Если приложение сделает неявную связь с модулем, где должна быть такая функция, то на операционных системах Windows 9x может произойти ошибка при загрузке, поскольку операционная система в процессе загрузки не сможет найти функцию. Если же сделать явную зависимость, то приложение может проверить - есть ли такая функция, и сделать её вызов только тогда, когда функция найдена - по крайней мере, приложение может продолжить работу всегда, хотя иногда функционал приложения может быть урезан. Имеется два типа зависимостей времени выполнения: явная зависимость (часто называемая динамической зависимостью) и зависимость с отложенной загрузкой. Явная зависимость может быть загружена в любой момент в течение жизни приложения, без предварительного уведомления операционной системы. Поэтому есть только один способ обнаружить явную зависимость - запуск приложения и отслеживание, какие модули оно загружает в процессе работы (для дополнительной информации по профайлингу см. раздел "Использование профайлинга (Application Profiling) для выявления динамических зависимостей (Dynamic Dependencies)"). При наличии явной зависимости приложение делает прямой вызов LoadLibrary и GetProcAddress, чтобы сделать свою работу. Зависимости с отложенной загрузкой реально реализованы так же как и явные зависимости, но загрузку должна выполнить библиотека-помощник (helper library) и линковщик. Большинство всех модулей Windows имеют встроенную "таблицу импорта" (import table). Эта таблица строится линковщиком и используется операционной системой для определения явных или перенаправленных зависимостей для имеющегося модуля. Любой модуль или функция в этом списке, которые не найдены, приведут к ошибке модуля. Если Вы укажете линкеру создать для модуля зависимость с отложенной загрузкой, то вместо того, чтобы сохранить информацию о модуле в основной import table, линкер сохранит её в отдельной таблице импорта с отложенной загрузкой (delay-load import table). Во время выполнения, если модуль обращается к модулю с отложенной зависимостью, вызов перехватывается хелпером (helper library). Этот хелпер использует LoadLibrary для загрузки модуля и GetProcAddress для опроса всех функций, которые представлены в модуле. Как только этот процесс завершится, вызов будет передан в реальную функцию, и выполнение программы продолжится без модуля, который сделал загрузку. Все будущие вызовы из специфичного модуля к модулю с отложенной загрузкой дальше будут делаться в уже загруженный модуль напрямую, без перехвата вызовов библиотекой хелпера. Библиотека хелпера, реализующая отложенную загрузку, имеет механизм оповещения вызывающей программы, если произошла ошибка. Как и в случае с явными зависимостями, если приложение подготовлено к такой ошибке, то это не должно создавать проблемы. Если обобщить сказанное, то неявные и отложенные зависимости требуют наличия соответствующего кода (реализованных зависимостей), чтобы в работе приложения не было ошибок и предупреждений. Явные или отложенные зависимости могут отсутствовать, и могут не нуждаться в экспорте всех функций, которые хотел бы импортировать родительский (вызывающий) модуль. Однако если приложение не подготовлено для обработки отсутствующих модулей явной или отложенной зависимости, или к обработке отсутствия функций в модуле явной или отложенной зависимости, то это может привести к ошибке времени выполнения приложения. Dependency Walker не может предсказать - планирует ли приложение обработать ошибки, так что он может просто предупредить Вас о всех потенциальных проблемах. Если Вы считаете, что приложение работает хорошо, то возможно Вы можете игнорировать большинство предупреждений, которые выдает Dependency Walker. Однако если Ваше приложение рушится, то предупреждения могут предоставить некоторую информацию о причине происходящего. Есть также другой тип предупреждения, генерируемого Dependency Walker при профайлинге, которое стоит упомянуть. Оно связано с первым и вторым исключениями (exceptions). Когда в приложении произойдет исключение (exception, наподобие access violation, нарушение доступа к памяти), приложению дают шанс обработать исключение. Эта возможность называется first chance exceptions. Если приложение обработает exception, то при этом не будет проблемы, и exception наверное можно проигнорировать. Если приложение не обрабатывает first chance exception, то исключение переходит в стадию second chance exception, которое обычно фатально для приложения. Когда произойдет second chance exception, операционная система обычно отображает диалог, который сообщает Вам, что приложение упало и должно быть завершено. Dependency Walker всегда записывает в лог second chance exceptions и может опционально записывать в лог first chance exceptions. Многие приложения обычно генерируют при работе first chance exceptions и обрабатывают их. Это не признак плохого приложения, поскольку есть много законных причин для генерации first chance exceptions и обработки их. [Обзор номеров версий модуля (Module Version Numbers)] Имеется 4 поля номера версии, которые гарантировано имеются в каждом модуле Windows. Все они имеют номера версий, состоящих из 2 частей (#.#). Эти поля включают: Image Version Версия образа - это значение устанавливает разработчик модуля, используя оператор VERSION в своем файле DEF, или используя опцию линковщика /VERSION. Это обычно представляет версию модуля или продукта, частью которого является модуль. Здесь может содержаться любое значение, поскольку его устанавливает разработчик. Если разработчик не указал версию, то по умолчанию это значение будет 0.0. OS Version Версия операционной системы - это значение показывает, для какой операционной системы был разработан модуль (где он должен работать). Определенные функции могут вести себя по-разному в зависимости от этого значения, чтобы сохранить совместимость приложения, которое было собрано для определенной версии операционной системы. Subsystem Version Версия подсистемы - это значение показывает, для какой версии подсистемы был разработан модуль. Большинство модулей используют значение по умолчанию, но разработчики могут это поменять, используя опцию линковщика /SUBSYSTEM, если целью является частная версия подсистемы, отличающаяся от той, что по умолчанию. Определенные функции подсистемы могут работать по-разному в зависимости от этого значения, чтобы сохранить совместимость с приложениями, собранными для частной версии подсистемы. Linker Version Версия линковщика - это значение представляет версию линкера, который использовался для сборки модуля. Это может использоваться для определения специфической особенности (доступен или нет определенный функционал) линкера во время сборки приложения. Например, зависимость отложенной загрузки является новой фичей, появившейся начиная с версии 6.0 линкера, так что если это значение меньше 6.0, то в модуле не должно быть зависимостей с отложенной загрузкой. В дополнение к 4 стандартным значениям версии разработчики могут добавить еще 4 дополнительных номера версии путем включения ресурса VERSION_INFO как части своего файла ресурсов. Эта структура ресурса имеет два поля, состоящих из 4 цифровых частей (#.#.#.#) и два текстовых поля. Они включают: File Version Value Версия файла - это поле известно как поле "FILEVERSION" в структуре ресурса VERSION_INFO. Это числовое значение, которое обычно соответствует собственной версии модуля, но может содержать любое значение, поскольку его может установить разработчик. Это значение в большинстве программ используется для того, чтобы сравнить два модуля, и узнать, какой из них новее. Product Version Value Версия продукта - это поле известно как поле "PRODUCTVERSION" в структуре ресурса VERSION_INFO. Это числовое значение, которое обычно соответствует версии продукта, частью которого является модуль, но может содержать любое значение, поскольку его может установить разработчик. Например, "Acme Tools version 3.0" является набором утилит, в который входит "Acme Virus Checker version 1.5" (антивирус Acme версии 1.5). Исполняемый файл антивируса может иметь версию файла 1.5.0.0 и версию продукта 3.0.0.0. File Version Text Текст версии файла - это поле известно как поле "FileVersion" в структуре ресурса VERSION_INFO. Это текстовая строка, обычно представляющая собственную версию модуля, но может содержать любой текст, поскольку его может установить разработчик. Product Version Text - это поле известно как поле "ProductVersion" в структуре ресурса VERSION_INFO. Это текстовая строка, обычно представляющая версию продукта, частью которого является модуль, но может содержать любую строку текста, поскольку его может установить разработчик. Dependency Walker показывает действительные значения версии FILEVERSION и PRODUCTVERSION, не текстовые строковые версии. Другие программы, такие как диалог Windows Properties, показывают текстовые значения версии, поскольку разработчик хотел бы, чтобы именно их увидел обычный рядовой пользователь. Например, Вы можете увидеть только "2.0" в диалоге Windows Properties для модуля, который имеет реальную версию 2.0.5.2034. Если Вы хотите узнать действительную версию файла, то Вам нужно использовать Dependency Walker, не диалог Windows Properties. Большим web-сайтом для поиска номеров версий модулей является база данных DLL компании Microsoft [2]. Этот сайт имеет детальную историю версий файлов DLL и перечисляет продукты, которые поставляются с каждой версией. Эта база данных может быть полезной в разрешении проблем с версиями. [Dependency Walker FAQ] Q001. Dependency Walker, как мне кажется, показывает только некоторые зависимости моего приложения. Почему он не показывает все зависимости? Q002. Почему во многих приложениях MPR.DLL показана красным под SHLWAPI.DLL, потому что в нем отсутствует функция с именем WNetRestoreConnectionA? Также я получаю сообщение "Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module" (предупреждение: как минимум в одном модуле есть нереализованный импорт из-за отсутствия экспорта функции в модуле зависимости с отложенной загрузкой). Q003. Почему MSJAVA.DLL показана желтым (отсутствующий модуль, missing module) и выдается сообщение "Warning: At least one delay-load dependency module was not found" (предупреждение: не найден как минимум один модуль с отложенной загрузкой)? Q004. Dependency Walker говорит, что у меня отсутствует APPHELP.DLL. Где я могу получить этот модуль? Q005. Может ли мне помочь Dependency Walker, если мой компонент не хочет регистрироваться? Или: почему REGSVR32.EXE отказывается регистрировать мою DLL, но Dependency Walker не показывает никаких ошибок в моей DLL? Самый лучший метод отладки и исправления ошибки модуля, который отказывается регистрироваться - открыть REGSVR32.EXE в Dependency Walker, а не Вашу DLL. Затем выберите запуск профайлинга (start profiling, F7). В диалоге профайлинга введите полный путь к Вашей DLL в поле "Program arguments" (аргументы программы). Для поля "Starting directory" (директория запуска), Вы можете захотеть ввести директорию, где находится DLL. Проверьте опции, которые хотите использовать, и нажмите Ok. Это действие запустит REGSVR32.EXE, которая сделает попытку зарегистрировать Вашу DLL. При действительно запущенной REGSVR32.EXE Вы сможете увидеть больше типов ошибок времени выполнения (runtime errors). Q006. Мое приложение лучше работает, когда я делаю его профайлинг в Dependency Walker, чем если оно работает самостоятельно. Почему так? Во-первых, создаются дополнительная нагрузка от Dependency Walker, так что Ваше приложение будет работать медленнее. Если Ваше приложение зависает по причине гонки процессов во время реального выполнения (race condition), то замедление работы может предотвратить гонку и устранить зависание. Если причина в этом, то значит проблема заключается в ошибочном дизайне приложения, и Вам просто повезло, если приложение не рассыпается в некоторых случаях (как например при работе из профайлинга Dependency Walker). Во-вторых, когда обычно потоки блокируются на критических секциях, событиях, семафорах, мьютексах и т. д., они будут разблокированы по принципу первый-вошел-первый-вышел (first-in-first-out, FIFO). Это не гарантируется операционной системой, но обычно это именно так. Когда идет выполнение приложения под отладчиком, то запросы FIFO иногда перемешиваются и получают случайный порядок, так что потоки могут быть заблокированы и разблокированы (block, resume) в другом порядке, отличающемся от порядка работы без отладчика. Это могло бы уменьшить условия для race condition или изменить условия выполнения для того, чтобы заставить потоки работать. И снова, если приложение написано так плохо, то Вам просто повезло, что оно иногда работает. И, наконец, приложения при работе под отладчиком автоматически получают в распоряжение пул памяти - кучу системы, system debug heap. Все функции, работающие с памятью, теперь буду обработаны несколько по-другому. Выделенные блоки памяти дополняются защитными байтами - чтобы проверить, не вышла ли запись за пределы выделенного региона буфера (buffer overrun/underrun). Выделения памяти могут также по-другому размещаться в памяти - в сравнении с тем, как если бы выделения были бы сделаны без отладчика. Так что если Вы пишете за конец буфера под отладчиком (случай переполнения буфера), то Вы можете перезаписать защитные байты, уже освобожденную память, или что-нибудь не очень критичное для работы. Однако, когда запустите программу без отладчика, Ваше переполнение буфера может вызывать критически последствия (например, портить указатель), и Ваше приложение зависнет или вызовет сбой. Вы можете отключить debug heap в Dependency Walker, и увидеть сбой при переполнении буфера во время профайлинга приложения. Если это так, то возможно у Вас проблема с переполнением буфера, забытым/плохим/освобожденным указателем и т. п. Чтобы сделать это, запустите командную строку (cmd). Введите команду "SET _NO_DEBUG_HEAP=1". Затем запустите Dependency Walker из командной строки. Это запретит debug heap для этого экземпляра Dependency Walker. Имейте в виду, что это работает только на Windows XP и более поздних системах. Q007. Как мне просмотреть параметры и возвращаемые типы функции? Q008. Почему имена моих функций экспортируются не так, как я их декларировал? Q009. Мое приложение выглядит нормально работающим во время профайлинга, но я вижу ошибки в области просмотра лога красные или желтые иконки в других областях просмотра Dependency Walker. Это нормально? Q010. Ого, мое приложение зависит от всех этих файлов? Какие из них мне нужно распространять с моим приложением? Q011. Что означает "Shared module not hooked" (общий модуль не подцеплен), и почему некоторые вызовы DllMain модуля не видны в логе? Q012. Почему некоторые модули показаны несколько раз под одним родительским модулем? Q013. Имеется ли версия Dependency Walker для работы из командной строки? Q014. Будет ли Will Dependency Walker обрабатывать модули COM, Visual Basic или .NET? Q015. Работает ли Dependency Walker с 64-битными модулями? Q016. Почему запрещены кнопка "Start Profiling" (запуск профайлинга) и соответствующий пункт в меню? Q017. Будет ли Dependency Walker работать с модулями Windows CE? Q018. Будет ли Dependency Walker работать с 16-битными модулями? Q019. Что означают все номера версий? Q020. Могу ли я вывести на печать результаты сессии? Q021. Как мне послать кому-нибудь результаты сессии? Q022. Что означают все иконки? Q023. Можно мне искать функцию по её имени или порядку следования? Q024. Диалог открытия файла Dependency Walker (open dialog) не показывает тот файл, который я хочу открыть. Как мне это исправить? Q025. Как мне деинсталлировать (удалить) Dependency Walker? Q026. Почему некоторые модули ищут функцию с именем "IsTNT" в KERNEL32.DLL? Q027. Почему некоторые модули пытаются загрузить модуль с названием "AUX"? Q028. MFC42.DLL пытается загрузить MFC42LOC.DLL, но она не найдена. Или: COMCTL32.DLL пытается загрузить CMCTLENU.DLL, но она не найдена. Почему так? [Ссылки] 1. Сайт Dependency Walker site:www.dependencywalker.com. |