Windows群集开发-编写微软群集服务器(MSCS)资源DLL:7)调试资源DLL

调试资源DLL

因为群集服务是作为Windows NT服务运行的,并且资源监视器在独立的进程中运行,因此会发现调试资源DLL要比普通的Windows NT DLL或应用程序复杂。

可以使用标准的基于微软Windows系统的调试器,还有群集管理器扩展DLL “DebugEx”,来调试资源DLLDebugEx扩展DLL允许在下一次启动资源监视器时对资源DLL进行调试(DebugExe扩展包含在产品中)。

使用WinDbgMicrosoft Developer Studios,或者其它任何基于Windows的调试器来调试资源DLL,则群集服务必须运行在与登录用户相同的安全上下文环境。(注意使用与群集服务相同的帐户登录并不意味运行在与群集服务相同的安全上下文环境。)要确保与群集服务运行于相同的安全上下文环境,必须停止群集服务,然后在命令行以-debug开关从本地启动群集服务。注意如果群集中有两个节点并且另一个节点已联机,而被调试的资源或资源类型在另一个节点上被加载,则调试器可能在该节点上被启动。

在调用调试器之前,确保将符号文件从SDK CD-ROM上的/Symbols目录拷贝到%windir%/Symbols目录。同样,确保将所有资源DLL用到.pdb文件拷贝到资源DLL所在的目录。

在调试资源DLL时,可以同时调试资源类型或属于该类型的资源两者,或两者之一。这将在下文解释。

要调试资源类型:

  • 设置资源类型的DebugControlFunctions属性为TRUE
  • 设置资源类型的DebugPrefix属性为调试器的路径。

ResourceTypeControl入口函数被调用时,群集服务会检查上述属性的设置。如果DebugControlFunctionTRUE并且DebugPrefix包含有效路径,则群集服务将为ResourceTypeControl创建一个新的资源监视器进程,并将指定的调试器贴附到该进程。

要调试资源DLL

  1. 注册DebugEx群集管理器DLL
  2. 启动群集管理器。
  3. 创建一个新的资源DLL所支持的资源类型。指定该资源将在分离的资源监视器中运行。(在调试期间,一个专有的资源监视器,以帮助将问题隔离,并确保其它资源不会对调试进程产生影响。)
  4. 选择新资源,然后从“File”菜单选择“Properties”。
  5. 单击“Debug”页。
  6. 在调试命令前缀编辑控件中,输入调试器的完整路径,例如,使用MSDEV,则输入:

7.  c:/msdev/bin/msdev.exe

  1. 单击OK
  2. 停止群集服务,输入:

10.net stop clussvc

  1. 在群集目录下输入以下命令以本地启动群集服务:

start clussvc –debug

该命令产生一个命令窗口来显示群集服务的输出。群集服务启动后将启动包含你的资源的资源监视器,并将调试器贴附上。此时,调试器将被调用。可以在DLL设置断点。例如,要调试ResourceTypeControl入口函数,将调试器贴附到主资源监视器进程,并在s_RmResourceTypeControl设置断点。也可以在DLL中设置额外的断点,在LodLibrary调用被单步跳过时。

平台SDK允许使用DebugEx扩展DLL来调试StartupOpen入口函数,通过指定DebugPrefix值为目标资源类型。当然DebugEx扩展不是绝对需要的,使用群集管理器,可以以资源为基础,或为所有某一类型的资源,打开或关闭调试。一旦DebugEx扩展被注册,Debug页面将出现所有资源类型上。如果想在资源被创建时调试资源DLL的启动代码,请先设置DebugPrefix属性。可以使用Cluster.Exe或打开资源类型属性,单击Debug页面,指定调试器。然后,当资源被创建时,勾选“Separate Resource Monitor”(分离的资源监视器),单击“下一步”按钮,调试器将立即启动。

当指定类型的资源被创建时,资源监视器将等到调试器被附加,并将在调用LoadLibrary后调用DebugBreak。一些调试器(例如CDBWinDbg0将在它们被附加后中断,其它的(如MSDEV)则不会。在这种情况下,资源监视器在调试器被附加和装载资源DLL后,将在调试器的输入窗口显示信息。

安装和设置

典型的群集可感知应用包含三个逻辑上的设置步骤:

  • 安装实际的程序
  • 配置程序的群集部分
  • 安装和注册客户端管理扩展

这些操作应该整合到单一的设置程序中,该程序应该独立提供上述操作的执行选项。

安装的许多设置部分是很重要地,且完全依赖于用户在设置管理扩展时输入的用户偏好。微软建议每个实现了资源DLL的群集可感知应用程序也应该实现群集管理扩展DLL

下面章节讨论安装入口的细节。

将程序进行安装

 

这部分将应用程序的拷贝安装在每个节点上。在安装进程中仅需要改变是的必须检查是否在某个群集节点上安装该应用程序。安装程序能够调用OpenCluster群集函数来进行检测是否安装正运行于群集环境。注意OpenCluster仅能告诉安装程序群集服务是否当前正在运行。因此,如果OpenCluster返回NULL,则安装程序应该检查已安装服务的数据库,来检测是否群集服务已安装但被关闭。如果群集服务没有运行,安装程序应该在继续安装之前向用户提供启动群集服务的选项。一旦应用程序在一个节点上安装完成,安装程序可以枚举其它节点,然后使用管理共享和注册表维护功能通过网络安装应用程序。

在某些情况下,应用程序可能被预先安装在没有群集的机器上。这时,如果系统被转换成群集节点,安装程序应该提供附加的安装选项。安装程序应该允许应用程序的数据文件(不是程序文件)被迁移到共享SCSI总线的磁盘上,向群集注册新资源类型,等等。不过,也可以简单的要求重新完全安装应用程序。

注意 不应该将程序文件存储在连接到群集共享SCSI总线的驱动器上。虽然所有的群集节点能够看到这些驱动器,好象是一个存放程序文件的好地方,但是这将在升级MSCS或应用程序时导致问题,特别是如果群集处于生产环境中。升级将要求群集被完全关闭。作为在群集的所有节点上安装应用程序文件的一个替代,可以选择“rolling upgrade”(滚动升级)-独立的升级每个节点-而不影响群集的操作。

配置群集

在安装过程一节,安装程序的配置部分应该通过调用群集管理函数CreateClusterResourceType来创建资源类型,并将支持该资源类型的对应的资源DLL安装在每个节点上。安装DLL时,安装程序应该将其拷贝到目标驱动器的应用程序安装目录,并注册其完整路径。

注意 DLL应该在资源类型被注册之前被拷贝到群集中所有节点上。如果不做这一步,附加到群集节点的群集管理器将不能访问资源DLL,并在添加资源类型或读取资源类型属性时提示错误。

最后,安装程序应该向群集注册群集管理扩展DLL。要向群集注册管理扩展,需要实现DllRegisterCluAdminExtension入口函数(在群集管理扩展中)。要向系统注册表注册群集管理扩展,需要实现DllRegisterServer入口函数。

网络管理员可能将自定义的资源类型与网络名字资源以及它所依赖的资源进行整合以创建一个客户端能够访问的虚拟服务。安装程序应该调用正确的群集API来确保网络管理员将所有必需的依赖项放在同一个组中。也应该配置资源以使用这些依赖项。例如,如果新创建的群集可感知应用依赖于数据文件,就要检测使用哪个驱动器。

安装和注册客户端管理扩展

客户端群集管理扩展是群集管理工具使用的管理扩展的一部分。设置程序应该将其拷贝到运行群集管理工具的机器上,并注册为inproc(进程内)服务器。

你可能感兴趣的:(Windows群集开发-编写微软群集服务器(MSCS)资源DLL:7)调试资源DLL)