你目前正处于脱机状态,正在等待 Internet 重新连接

Windows NT 调试符号设置信息

本文的发布号曾为 CHS138258
本文已归档。它按“原样”提供,并且不再更新。
概要
本文提供有关如何设置 Microsoft Windows NT 符号树的详细信息,以及高级设置提示与技巧。
更多信息

文章目录



  • 常规信息
  • 设置自定义符号树
  • 单处理器与多处理器的比较
  • 自定义 HAL.DLL
  • 在调试程序中使用符号
  • 验证符号
  • 高级符号验证
  • 已检查版本

常规信息



要在 Windows NT 中进行内核模式和用户模式调试,就需要有调试符号文件(符号)。符号提供了对已加载的可执行文件中的全局变量和函数名称的引用方法。

符号是通过链接器生成的。这些符号从零售产品中分离出来,保存在单独的 (.DBG) 文件中。这大大减少了文件大小,从而减少了文件加载时间,提高了系统性能。同时,这也减少了安装软盘的数目。符号代表了函数/API 名称和全局变量。

.DBG 文件包含了每个文件的符号信息。它们可以在安装 CD-ROM 上的 \Support\Debug\[i386 | mips]\Symbols 中找到。也可以在 NT 版服务器上找到。位置是 \\Ntbuilds\Release\Usa\Build###\[x86 | mips |alpha]\Fre.srv\symbols。

Symbols 目录分为 7 个子目录,称为“扩展子目录”(注意:这些目录中的很多符号文件是 User 模式):

COM - 最后生成 .COM 的所有文件的符号在此
CPL - 最后生成 .CPL 的所有文件的符号在此
DLL - 最后生成 .DLL 的所有文件的符号在此
DRV - 最后生成 .DRV 的所有文件的符号在此
EXE - 最后生成 .EXE 的所有文件的符号在此
SCR - 最后生成 .SCR 的所有文件的符号在此
SYS - 最后生成 .SYS 的所有文件的符号在此

符号必须与文件版本一致:

来自不同内部版本的符号会提供错误的信息,并迷惑开发人员,还会浪费很多时间。请与客户仔细核对其正在运行的内部版本,以及他是否安装了任何补丁程序。“内核停止屏幕”将显示内核的内部版本编号。

补丁程序的内部版本:

补丁的内部版本(如 Service Pack)需要一组特殊的符号,这些符号是基本内部版本号与补丁符号的组合。

设置自定义符号树



切记,符号必须与安装在客户计算机上的文件相匹配。通常,您必须为特定客户创建一组自定义符号。

备注:“完整的符号树”会占用 30 MB 以上的磁盘空间。
  1. 创建一个用来存储客户符号集的子目录。例如:

    C:\MYSYMBOLS
  2. 总是以基本 Windows NT 版本号开始。从安装 CD-ROM 中复制相应版本的下列文件:

    XCOPY \SUPPORT\DEBUG\I386 C:\MYSYMBOLS /S。
  3. 将相应的 Service Pack 二进制文件的符号复制到您的自定义树上。Service Pack 符号可以在下一节“符号位置”所列出的服务器上找到。
  4. 将第三方补丁程序(如 Compaq SSD 符号)复制到您的自定义符号树上。您可能需要从供应商处获得这些符号。 备注:根据客户选择的不同安装顺序,步骤 3 和 步骤 4 可能需要颠倒一下。请与客户的步骤一致。
  5. 如果服务器已经安装了修补程序,那么您需要获得与该修补程序一致的符号。如果修补程序不提供符号文件,您需要与 Microsoft 产品支持服务人员联系,以便了解这些符号的可用性。将更新后的符号复制到您的自定义符号树上。确保已将其放入正确的子文件夹(例如, Sys、exe、dll 等)中。

单处理器与多处理器的比较



Windows NT 将特殊内核用于 SMP 系统。在安装过程中,该内核将被重命名。切记,还要重命名 SYMBOL.DBG 文件,以便进行调试。
NTOSKRNL.EXE NTOSKRNL.DBG = 单处理器 NTKRNLMP.EXE. NTKRNLMP.DBG = 多处理器

  1. 如果有多处理器系统,请执行下列操作。在 \SYMBOLS\EXE 下的自定义符号树下,有两个内核文件。将 NTOSKRNL.DBG 文件重命名为 NTOSKRNL.UNI。
  2. 将 NTKRNLMP.DBG 复制到 NTOSKRNL.DBG 文件。

自定义 HAL.DLL



某些硬件平台需要特殊的“硬件抽象层驱动程序”。与内核文件一样,自定义 HAL 会在安装过程中被重命名。以下是常见 HAL 文件的列表:

用于 I386 计算机的 HAL 文件:
              未压缩文件名      大小(字节)   说明-------------------------------------------------------------------------HAL.DLL       48,416       用于 Intel 系统的标准 HALHAL486C.DLL   47,376       用于 486 c 步处理器的 HALHALAPIC.DLL   63,616       HALMPS.DLL 的单处理器版本HALAST.DLL    46,416       用于 AST SMP 系统的 HALHALCBUS.DLL   79,776       用于 Cbus 系统的 HALHALMCA.DLL    45,488       用于 MCA 系统(PS/2 和其它)的 HALHALMPS.DLL    65,696       用于大多数 Intel 多处理器系统的 HALHALNCR.DLL    79,392       用于 NCR SMP 机器的 HALHALOLI.DLL    40,048       用于 Olivetti SMP 机器的 HALHALSP.DLL     52,320       用于 Compaq Systempro 的 HALHALWYSE7.DLL  40,848       用于 Wyse7 系统的 HAL用于 DEC Alpha 计算机的 HAL 文件:              未压缩文件名      大小(字节)   说明--------------------------------------------------------------------------HAL0JENS.DLL  56,800       Digital DECpc AXP 150 HALHALALCOR.DLL  69,120       Digital AlphaStation 600 FamilyHALAVANT.DLL  66,752       Digital AlphaStation 200/400 Family HALHALEB64P.DLL  70,528       Digital AlphaPC64 HALHALGAMMP.DLL  72,896       Digital AlphaServer 2x00 5/xxx Family HALHALMIKAS.DLL  67,040       Digital AlphaServer 1000 Family UniprocessorHALHALNONME.DLL  65,376       Digital AXPpci 33 HALHALQS.DLL     65,088       Digital Multia MultiClient Desktop HALHALSABMP.DLL  72,736       Digital AlphaServer 2x00 4/xxx Family HAL用于 MIPS 计算机的 HAL 文件:              未压缩文件名      大小(字节)   说明--------------------------------------------------------------------------HALACR.DLL    43,648       ACER HALHALDTI.DLL    68,288       DESKStation EvolutionHALDUOMP.DLL  41,728       Microsoft-designed dual MP HALHALFXS.DLL    42,016       MTI with a r4000 or r4400HALFXSPC.DLL  42,176       MTI with a r4600HALNECMP.DLL  44,736       NEC dual MPHALNTP.DLL    116,000      NeTpower FASTseriesHALR98MP.DLL  127,232      NEC 4 processor MPHALSNI4X.DLL  95,520       Siemens Nixdorf UP and MPHALTYNE.DLL   68,032       DESKstation Tyne用于 PPC 计算机的 HAL 文件:              未压缩文件名      大小(字节)   说明--------------------------------------------------------------------------HALCARO.DLL   169,504      HAL for IBM-6070HALEAGLE.DLL  206,208      HAL for Motorola PowerStack and Big BendHALFIRE.DLL   136,576      Hal for Powerized_ES、Powerized_MX 和Powerized_MX MPHALPOLO.DLL   169,152      HAL for IBM-6030HALPPC.DLL    169,184      HAL for IBM-6015HALWOOD.DLL   95,616       HAL for IBM-6020


如何确定要使用哪个 HAL:

在安装过程中,将创建一个文本日志文件。该文件会说明 HAL 的原始名称。
  1. 转到 %systemroot%\REPAIR 子目录。
  2. 运行 ATTRIB -R -H -S SETUP.LOG,使得文件可见。
  3. 在 Microsoft “记事本”中打开文件,然后搜索 HAL。
备注:可以使用相同的方法来验证是否还使用了特殊的内核。

转到设置 HAL 符号:
  1. 转到 \SYMBOLS\DLL 下的自定义符号树。
  2. 将 HAL.DBG 重命名为 HAL.X86。
  3. 将“Custom HLL.DBG”复制到 HAL.DBG。

在调试程序中使用符号



Windows NT 调试程序(如 I386KD.EXE)将在下列位置查找符号:
_NT_ALT_SYMBOL_PATH 系统环境变量
_NT_SYMBOL_PATH 系统环境变量

这些位置是通过系统环境变量设置的。它们通常是由调试批处理文件使用 SET 命令来配置的。_NT_ALT_SYMBOL_PATH 是可选的。例如:
set _NT_SYMBOL_PATH=K:\NT35-SP3\SYMBOLS
set _NT_ALT_SYMBOL_PATH=c:\WINNT\SYMBOLS

备注:符号目录是直接在扩展子目录以上的目录(即,如果内核符号文件 NTOSKRNL.DBG 位于 C:\DEBUG\511\I386\SYMBOLS\EXE\NTOSKRNL.DBG,则 _NT_SYMBOL_PATH 应设置为 C:\DEBUG\511\I386\SYMBOLS)

如何使用路径:

这些不同路径的一个好的用途是用于保存每个 Windows NT 版本的静态符号树。您只需在需要的时候将符号路径指向每个版本和 Service Pack 即可。例如,对于安装有 SP2 的 1057 系统,可以使用如下命令行:
set _NT_ALT_SYMBOL_PATH=c:\NT351-SP2\SYMBOLS
set _NT_SYMBOL_PATH=K:\NT351-1057\SYMBOLS

调试程序将首先使用 Service Pack 符号。(这种情况下,Service Pack 符号不包含基本内部版本符号,而只包含 SP 符号。)如果调试程序在 SP 树中找不到特殊符号,它将查找 1057 符号树。

搜索顺序:

搜索不同的符号路径时将使用上面列出的搜索顺序。将使用第一个被搜索到的、具有正确名称的符号文件。在上述示例中,_NT_ALT_SYMBOL_PATH=c:\NT351-SP2\SYMBOLS 是第一个被搜索的。

环境变量覆盖:

I386KD 支持命令行开关“-y”,您可以用它指定符号路径。不过,使用该开关将覆盖已有的环境变量。

更改符号搜索路径:

可以在任何时候在调试程序中使用“!Sympath”命令来更改符号搜索路径。例如:
!SYMPATH C:\SYMBOLS。

验证符号



!RELOAD:

第一次得到“kd>”提示时,必须键入“!RELOAD”。这会重新加载并同步符号信息。如果得到“PsLoadedModuleList is NULL!”错误消息,则可能加载了错误的符号。请确保您为正在调试的计算机安装了正确的 HAL.DBG 和 NTOSKRNL.DBG 文件。

!PROCESS:

也可以通过键入“!PROCESS”来验证符号,如果得到“Can't find process list head”错误消息,则可能加载了错误的符号。

KB:

如果“堆栈跟踪”在函数名称列表中有缺项,则表明您正在丢失符号。丢失函数还可能表示堆栈损坏,但这种情况比较少见。在声明堆栈损坏之前,请先仔细检查您的符号。此外,请查看堆栈上的返回地址。这些地址应当大于 8000000。

!SYMPATH:

要纠正不正确的符号,可以执行这些步骤:转到另一个命令窗口,复制正确的符号,然后在调试程序上执行 !reload,或者使用 !SYMPATH symbol_path 来指定正确的路径。

高级符号验证



有时,客户不知道在其计算机上所安装的驱动程序的版本号。可能他们安装了 NTFS 的修补程序,但不知道是哪一个错误号。这时,您可能需要手动确定需要哪个 .DBG 文件。

彻底验证目标和 dbg 是否匹配的最好方法是查看其校验和的值。该值存储在文件头中。

备注:要了解有关操作系统文件格式的更多信息,请在 MSDN 中查找“Portable Execution File Format”。PE 头包含版本号、链接日期\时间等。

这里的一般计划是,先找出客户文件的校验和,然后查找具有一致校验和的 dbg 文件。

从目标和 dbg 中提取校验和的方式有多种。如果有访问文件的权限,则可以使用下列方法:该示例假设您对 NTOSKRNL 文件有兴趣。

LINK32:

该实用工具可以在 NT Build 子目录 \MSTOOLS 中找到:
LINK32.EXE -DUMP -HEADERS NTOSKRNL.EXE LINK32.EXE -DUMP -HEADERS NTOSKRNL.DBG

DUMPBIN:

该实用工具可以在 Visual C bin 目录中找到:
DUMPBIN.EXE /HEADERS NTOSKRNL.EXE DUMPBIN.EXE /HEADERS NTOSKRNL.DBG

如果您是在系统或故障转储上使用调试程序,则可以通过查看内存中的文件头来查找目标文件的校验和。
  1. !DRIVERS - 将为您提供驱动程序基址。
  2. dd baseaddr+d8 L1

已检查版本



如果您安装的是已进行调试检查的 Windows NT 文件版本,则需要为 dbg 符号文件做特殊安排。某些已检查过修补程序的内部版本将符号信息内置在目标文件中。这些情况下,只需复制该文件,然后将其命名为 *.DBG 文件。并将该文件放在常规符号子目录中,即 \SYMBOLS\EXE。

与免费版一样,所有公开发布的已检查过的内部版本都有单独的 dbg 文件。但是,已检查版本与免费版本的 dbg 是不同的。例如,MS NT DDK 包含完整和经过检查的 NT 内部版本。它还包含附带的完整符号集。

备注:对于多处理器系统和单处理器系统,NT 内核的已检查版本是相同的。

符号位置



零售产品:
CD-ROM \SUPPORT\DEBUG\I386\SYMBOLS
\\NTX86X\FREEBINS.XXX

prodnt debugref
属性

文章 ID:138258 - 上次审阅时间:12/04/2015 12:10:09 - 修订版本: 1.2

Microsoft Windows NT Advanced Server 3.1, Microsoft Windows NT Server 3.5, Microsoft Windows NT Server 3.51, Microsoft Windows NT Server 4.0 Standard Edition, Microsoft Windows NT Workstation 3.1, Microsoft Windows NT Workstation 3.5, Microsoft Windows NT Workstation 3.51, Microsoft Windows NT Workstation 4.0 开发员版, Microsoft Windows NT Advanced Server 3.1

  • kbnosurvey kbarchive kbusage KB138258
反馈