定制调试诊断工具和实用程序

news/2024/7/8 5:51:18

 

定制调试诊断工具和实用程序
——摆脱DLL"地狱"(DLL Hell)的困扰(一)
原著:Christophe Nasarre
编译:NorthTibet

下载源代码:Debugsrc0206.exe (583KB)
原文出处:Windows XP:Escape from DLL Hell with Custom Debugging and Instrumentation Tools and Utilities


本文假设你熟悉 Win32,DLL

摘要

  
在 Windows 系统中,动态库版本冲突实在是一个老大难的问题了,为了解决这个问题,除了使用大量现有的工具外,你还可以利用丰富的 Windows APIs 函数构造自己的调试工具和实用程序。作为例子,本文将提供三个这种类型的工具,讨论如何利用它们来解决动态库的冲突问题。这三个工具分别是:

  • DllSpy——列出加载到系统中的所有 Dlls 以及所有使用这些 Dlls 的进程;
  • ProcessSpy——列出系统中所有正在运行的进程以及它们正在使用的 Dlls;
  • ProcessXP——显示 Windows XP 所有并发运行的会话(Sessions)清单;
  •   从所周知,动态库“地狱”(DLL Hell)已经不是什么新鲜玩意儿了,如果你使用第三方的 Dlls,肯定会碰到不少与它有关的问题,如找不到入口点,或者库版本不兼容等。.NET 中允许组件的并行执行,减少了产生这种问题的几率,但是如果你还没有升级到 .NET 环境,那怎么办?针对这种情况,可用的方法是用不同的工具跟踪 DLL 的依赖性。但是用标准工具跟踪时,你可能最后得不到所要的信息。许多工具都没有你需要的功能,比如自动写日志文件,跟踪分析,仅在控制台操作脚本控制等。
      本文我们先用一些现有的工具来考察系统中的运行进程,然后系统地研究本文提供的三个工具:DllSpy, ProcessSpy 和 ProcessXP,以便在今后的开发或调试中使用这些工具和技术。

    现有的工具

      Depends.exe 是 Visual C++ 自带的一个工具。它可能是我们经常使用的工具中最简单的一个工具了,其功能是列出某个应用程序或 DLL 需要的 DLLs。这个程序在本站可以下载(更新版本请到下面这个地址下载:http://www.dependencywalker.com)。如果你需要看某个 DLL 或可执行文件的全路经,可以用它的上下文菜单进行设置:如图一:


    图一 察看全路经

      对于静态加载的情况(即应用程序在链接过程中将 dlls 对应的 lib 文件链接到程序中),这个工具非常好用,但对于版本较新的系统,大多使用 COM 编程接口,或者说是用 COM 对象编程模型,而 COM 对象的实例化都是运行时加载或者说动态加载某个 DLL 文件,然后通过 LoadLibrary 和 GetProcAddress 调用其中某个特殊的函数来实现的。你不知道这个 DLL 是何时、从哪里被加载的。
      一种确定 DLLs 被动态加载的方法是找出需要被每一个进程加载的 DLL。Sysinternal 公司(http://www.sysinternals.com)提供了一个工具软件 ListDlls.exe。它是一个控制台程序,其图形用户界面(GUI)版本为 Process Explorer。如图二:


    图二 Process Explorer 运行画面

      除了列出被某个进程使用的 DLLs 之外,还可以用这个工具了解某个程序用到了哪个 kernel 对象,从版本3.11之后,Process Explorer 还可以让你在两个快照之间轻松扫描到新的或未使用的对象。
      有时候在你用 Process Explorer 扫描到某个进程之前,它可能已经被加载然后又在很短的时间内被卸载了。碰到这种情况时,你需要另外一种类型的工具,我们将在后文中讨论。
      为了操纵进程和 DLLs,首先你必须知道每一个被加载的 DLL 被哪些进程使用。本文的例子程序 DllSpy 实现目的即在于此。如图三所示:


    图三 DllSpy 运行画面

      DllSpy程序上面的窗格列出的是所有已经加载的 DLL,每选中一个DLL,在下面的窗格中就会列出使用该 DLL 的所有进程。
    而 ProcessSpy 例子程序的功能正好与 DllSpy 相反,它在上面窗格列出系统中所有的运行进程,每选中一个进程,在下面窗格便显示出此进程使用的所有 DLLs,如图四所示:


    图四 ProcessSpy 运行画面

      下面窗格还反映了 DLL 加载的地址是实际地址还是首选地址,以及它们的从属性是静态的还是动态的。这些工具的源代码和可执行程序都可以从本文的下载链接中下载,它们也许不完全满足你的需要,但可以作为技术参考,对编程工作肯定是有所裨益的。

    参考资料

    • 如何用 Win32 APIs 枚举应用程序窗口和进程
    • 如何在 Windows NT、Windows 2000 和 Windows XP 中使用VDMDBG函数?
    • 如何从程序中调用外壳的文件属性对话框?
    • Windows NT 系统中如何启动和终止 16 位 Windows 应用程序?

      下回我们将讨论如何获取 Win32 系统中运行的进程信息。

    (待续)

     

作者简介
    Christophe Nasarre
是法国 Business Objects 公司的技术经理(technical manager)。他在 Windows 平台上(3.0 以后的版本)编写了若干个低级工具。他的联系方式:cnasarre@montataire.net.
.
本文出自 MSDN Magazine 的 June 2002 期刊,可通过当地报摊获得,或者最好是 订阅

转自:http://www.vckbase.com/document/viewdoc/?id=1590


http://www.niftyadmin.cn/n/3102294.html

相关文章

产品经理需要的技能,我有吗?

经常被问产品经理需要哪些技能?或许能说出二三,但是更多时候我在思忖,我是否有这些技能? 一.逻辑能力 产品经理需要把用户所有的操作情况都考虑到,尽可能多的考虑使用场景,这需要严谨的逻辑分析能力。而我作…

远程音视频(摄像头、麦克风)监控(amccap)/mms流媒体直播服务器编程实现

转自:http://hi.baidu.com/it_security/blog/item/315f36d0f382eadb562c8474.html 远程音视频(摄像头、麦克风)监控(amccap)/mms流媒体直播服务器编程实现2009-03-10 00:41使用windows media encoder sdk V9.0 (wMencsdk/wm encoder/wmencoder)。 稍作改进可以1&…

SharePoint 2010 工作流解决方案:将 SharePoint Designer 可重用工作流导入 Visual Studio(1)...

将 SharePoint Designer 可重用工作流导入 Visual Studio 在 SharePoint Designer 中创建的工作流(即,声明性工作流)由 XML 语句组成,而非由代码组成。 SharePoint Designer 2010 引入了可重用工作流,它们是可由 Share…

C++实现的基于链表的通讯录管理系统

摘 要 随着计算机应用技术的快速发展和日益普及,网络也遍及到我们生活的每个角落,为我们的学习和工作带来极大的方便。很多人都使用过传统的纸质通讯录,与之不同的另外一种管理方式——程序通讯录管理。程序通讯录管理系统面向全部用户&…

配置一个编码进程

转自:http://www.host01.com/Print.Html?90651 配置一个编码进程 要想完全地配置一个编码程序,下面的接口必须被正确地设置。注意可选择的接口。 1. The IWMEncAttributes interface (optional).(可选择的,随意的&…

HearthBuddy卡牌无法识别

界面上无法识别,提示是 [Unidentified card ID :DAL_010][Unidentified card ID :DAL_415] 搜索getcardid,在所有的相关函数处设置断点,看会进入哪里的断点 发现是进入了namespace Triton.Game.Mapping [Attribute38("EntityBase")…

基于QT和MYSQL数据库实现的学生信息管理系统

一、使用说明 该学生信息管理系统使用的数据库为MySQL,在另外一台电脑上(老师的电脑)运行时运行环境必须满足以下要求: 那台电脑必须要安装数据库MySQL; 在那台电脑的MySQL中导入本人数据库脚本文件 studentmanager.sql &#x…

本篇讲述详解windows XP系统内核文件的文章主题

摘自:http://blog.cfan.com.cn/html/29/213629-44011.html