2023年1月

概要

本文分步介绍了如何使用 WinDbg 调试程序 (windbg.exe) 调试 Windows 服务。 要调试 Windows 服务,可以在服务启动后将 WinDbg 调试程序附加到托管该服务的进程,或者可以配置服务以在启动时附加 WinDbg 调试程序,以便解决与服务启动相关的问题。 本文将介绍这两种方法。

服务启动后将 WinDbg 调试程序附加到服务

此方法与你用于将调试程序附加到进程然后调试进程的方法类似。

使用托管要调试服务的进程的进程 ID

  1. 若要确定托管要调试服务的进程的进程 ID (PID),请使用以下任一方法。

    方法 1: 使用任务管理器


      1. 右键单击任务栏,然后单击
        “任务管理器”。 随即显示“Windows 任务管理器”对话框。
      2. 单击“Windows 任务管理器”对话框的
        “进程”选项卡。
      3. 在“映像名称”下,单击托管要调试服务的进程的映像名称。 请注意,此进程的进程 ID 是由
        相应的 PID 字段值指定的。

    方法 2: 使用任务列表实用工具 (tlist.exe)


      1. 单击“开始”,然后单击
        “运行”。 随即出现“运行”对话框。
      2. 在“打开”框中,键入
        cmd,然后单击“确定”。
      3. 在命令提示符处,更改目录路径以显示计算机上的 tlist.exe 文件位置。
        注意 tlist.exe 文件通常位于以下目录中: C:\Program Files\Debugging Tools for Windows
      4. 在命令提示符处,键入
        tlist 以列出计算机上当前运行的所有进程的映像名称以及进程 ID。
        注意 请记下托管要调试服务的进程的进程 ID。
  2. 在命令提示符处,更改目录路径以显示计算机上的 windbg.exe 文件位置。
    注意 如果命令提示符未打开,请按照方法 1 的步骤 a 和 b 操作。 windbg.exe 文件通常位于以下目录中: C:\Program Files\Debugging Tools for Windows。
  3. 在命令提示符下,键入 windbg –p
    ProcessID /g 以将 WinDbg 调试程序附加到托管要调试服务的进程。
    注意 ProcessID 是托管要调试服务进程的进程 ID 的占位符。

使用托管要调试服务的进程的映像名称

 

只能在托管要运行服务的进程正好存在一个正在运行的实例时使用此方法。 为此,请按照下列步骤操作:

  1. 单击“开始”,然后单击
    “运行”。 随即出现“运行”对话框。
  2. 在“打开”框中,键入
    cmd,然后单击“确定”以打开命令提示符。
  3. 在命令提示符处,更改目录路径以显示计算机上的 windbg.exe 文件位置。

    注意 windbg.exe 文件通常位于以下目录中: C:\Program Files\Debugging Tools for Windows。
  4. 在命令提示符下,键入 windbg –pn
    ImageName /g 以将 WinDbg 调试程序附加到托管要调试服务的进程。

    注意 ImageName 是托管要调试服务进程的映像名称的占位符。 “-pn”命令行选项指定
    ImageName 命令行参数是进程的映像名称。

启动 WinDbg 调试程序并附加到托管要调试服务的进程

  1. 启动 Windows 资源管理器。
  2. 找到计算机上的 windbg.exe 文件。

    注意 windbg.exe 文件通常位于以下目录中: C:\Program Files\Debugging Tools for Windows
  3. 同时运行 windbg.exe 文件和 /g 命令行开关以启动 WinDbg 调试程序。 设置断点后,/g 命令行开关允许跟踪的进程继续运行。
  4. 在“文件”菜单中,单击“附加到进程”以显示“附加到进程”对话框。
  5. 单击以选择托管要调试服务的进程相应节点,然后单击
    “确定”。
  6. 在出现的对话框中,单击“是”以保存工作区基本信息。 请注意,现在你可以调试服务的反汇编代码。

配置服务以在启动时附加 WinDbg 调试程序

如果要解决与服务启动相关的问题,可以使用此方法调试服务。

配置“映像文件执行”选项。 为此,请使用下列方法之一:

方法 1: 使用全局标志编辑器 (gflags.exe)
  1. 启动 Windows 资源管理器。

找到计算机上的 gflags.exe 文件。

注意 gflags.exe 文件通常位于以下目录中: C:\Program Files\Debugging Tools for Windows。

运行 gflags.exe 文件以启动全局标志编辑器。

在“映像文件名称”文本框中,键入托管要调试服务的进程的映像名称。 例如,如果要调试由映像名称为 MyService.exe 的进程托管的服务,请键入
MyService.exe。

在“目标”下,单击以选中“映像文件选项”选项。

在“映像调试程序选项”下,单击以选中“调试程序”复选框。

在“调试程序”文本框中,键入要使用的调试程序的完整路径。 例如,如果要使用 WinDbg 调试程序来调试服务,可以键入与以下路径相似的完整路径: C:\Program Files\Debugging Tools for Windows\windbg.exe。单击“应用”,然后单击,“确定”退出全局标志编辑器。

方法 2: 使用注册表编辑器

  1. 单击“开始”,然后单击
    “运行”。 随即出现“运行”对话框。
  2. 在“打开”框中,键入
    regedit,然后单击“确定”以启动注册表编辑器。
  3. 重要说明
    本部分(或称方法或任务)包含有关如何修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,请务必严格按照这些步骤操作。
    为了获得进一步的保护,请在修改注册表之前对其进行备份。 这样就可以在出现问题时还原注册表。
    有关如何备份与还原注册表的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

    322756 如何在 Windows 中备份和还原注册表

.cordll (控制CLR调试)

简介

.cordell命令控制托管代码调试和Microsoft.NET公共语言运行库(CLR)。

使用形式

.cordll[Options]

参数

  • Options
    使用以下一个或多个以下选项:
    -l (小写的 L)

    加载 CLR 调试模块。

    -IModule (大写的 i)

    指定的名称或要进行调试的 CLR 模块的基址。

    -u

    卸载 CLR 调试模块。

    -e

    启用 CLR 调试。

    -d

    禁用 CLR 调试。

    -D

    禁用 CLR 调试和卸载 CLR 调试模块。

    -N

    重新加载 CLR 调试模块。

    -lpPath

    指定 CLR 调试模块的目录的路径。

    -se

    通过使用 CLR 调试模块的短名称,启用 mscordacwks.dll。

    -sd

    禁用使用CLR调试模块的短名称mscordacwks.dll。相反,调试器使用CLR调试模块的长名称mscordacwks_<spec>.dll。如果担心不匹配,禁用短名称使用可以避免使用本地CLR。

    -ve

    打开CLR模块加载的详细模式。

    -vd

    关闭CLR模块加载的详细模式。

支持环境

模式

用户模式下,内核模式

目标

实时、 崩溃转储

平台

全部

备注

要调试托管应用程序,调试器必须加载与应用程序加载的CLR相对应的数据访问组件(DAC)。但是,在某些情况下,应用程序加载多个CLR。在这种情况下,可以使用I参数指定调试器应加载哪个DAC。CLR的版本2名为Mscorwks.dll,而CLR的版本4名为CLR.dll。下面的示例演示如何指定调试器应加载版本2(mscorwks)的DAC。

.cordll -I mscorwks -lp c:\dacFolder

如果省略I参数,则调试器默认使用版本4。例如,以下两个命令是等效的。

.cordll -lp c:\dacFolder
.cordll -I clr -lp c:\dacFolder

Sos.dll是用于调试托管代码的组件。当前版本的Windows调试工具不包括任何版本的sos.dll。内核模式调试中支持.cordell命令。但是,除非调出必要的内存,否则此命令可能无法工作。

 

 

 

 

找到个好东西

为什么要归档

此存档提供帮助,并可能提供对以下问题的答案

  • 是否可以使WinDBG在符号存储中找到mscordacwks.dll?,
  • Windbg需要不同版本的mscordacwks.dll,如何下载mscordacwks和mscorwks的正确版本?,
  • WinDbg要求mscordacwks.dll的特定版本。我在哪能找到这个?,
  • WinDbg x64:无法调试崩溃转储-未能加载数据访问DLL和
  • 在哪里可以找到和下载不同版本的mscorwks.dll和mscordacwks.dll?

下载mscordacwks和SOS

[ICO]NameLast modifiedSize
[DIR] x64/ 2017-11-05 15:32 -
[DIR] x86/ 2017-11-05 15:31 -
[   ] sos.zip 2017-11-05 15:33 124M

问题的引出

我在调试某个崩溃问题时,要跟踪clr的栈,于是,我先执行了指令.loadby sos clrjit,没有报错,然后我又执行!clrstack,结果却有如下输出:
0:000:x86> !clrstack
CLRDLL: Consider using ".cordll -lp <path>" command to specify .NET runtime directory.
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
            2) the file mscordacwks.dll that matches your version of clr.dll is
                in the version directory or on the symbol path
            3) or, if you are debugging a dump file, verify that the file
                mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
            4) you are debugging on supported cross platform architecture as
                the dump file. For example, an ARM dump file must be debugged
                on an X86 or an ARM machine; an AMD64 dump file must be
                debugged on an AMD64 machine.

You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll.  .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.

If you are debugging a minidump, you need to make sure that your executable
path is pointing to clr.dll as well.
也就是说执行失败了,看不了栈,根据输出建议执行.cordll -ve -u -l,有如下输出
0:000:x86> .cordll -ve -u -l
CLRDLL: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll:4.8.4042.00 f:8
doesn't match desired version 4.7.3132.00 f:8
CLRDLL: Unable to find mscordacwks_x86_x86_4.7.3132.00.dll by mscorwks search
CLRDLL: Unable to find 'mscordacwks_x86_x86_4.7.3132.00.dll' on the path
CLRDLL: Unable to get version info for 'f:\debug_symbol\symbols32\clr.dll\5B5543296ee000\mscordacwks_x86_x86_4.7.3132.00.dll', Win32 error 0n87
Cannot Automatically load SOS
CLRDLL: ERROR: Unable to load DLL mscordacwks_x86_x86_4.7.3132.00.dll, Win32 error 0n87
CLRDLL: Consider using ".cordll -lp <path>" command to specify .NET runtime directory.
CLR DLL status: ERROR: Unable to load DLL mscordacwks_x86_x86_4.7.3132.00.dll, Win32 error 0n87
傻子都知道发生了什么问题,就是没有“mscordacwks_x86_x86_4.7.3132.00.dll”和"SOS_x86_x86_4.7.3132.00.dll",由于我机子是联网的,也配好了windows符号服务器,应该说在上面的过程中应该已经下载下来了,现在没有,只能是到出问题的机器上考这两个文件了。

考了这两个文件,按理说我可以放在任何目录,可是我想放载windbg设置的符号目录,于是我将考过来的"mscordacwks.dll"和"SOS.dll"改名为“mscordacwks_x86_x86_4.7.3132.00.dll”和"SOS_x86_x86_4.7.3132.00.dll",然后在windbg设置的符号目录下以这两个文件名新建两个子文件夹,把这两个文件分别考到对应的子文件夹,在次执行.cordll -ve -u -l,跟上次输出一样,我看了下之前Windbg自行下载的其他版本的目录,发现,在还有一级目录,如下:

 

 

也就是说,我也还要需要在建立一级子目录,可是这个目录名称我该用什么呢,瞎折腾一阵,我后来注意到.cordll -ve -u -l的输出有这么一句:

0:000:x86> .cordll -ve -u -l
CLRDLL: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll:4.8.4042.00 f:8
doesn't match desired version 4.7.3132.00 f:8
CLRDLL: Unable to find mscordacwks_x86_x86_4.7.3132.00.dll by mscorwks search
CLRDLL: Unable to find 'mscordacwks_x86_x86_4.7.3132.00.dll' on the path
CLRDLL: Unable to get version info for 'f:\debug_symbol\symbols32\clr.dll\5B5543296ee000\mscordacwks_x86_x86_4.7.3132.00.dll', Win32 error 0n87
Cannot Automatically load SOS
CLRDLL: ERROR: Unable to load DLL mscordacwks_x86_x86_4.7.3132.00.dll, Win32 error 0n87
CLRDLL: Consider using ".cordll -lp <path>" command to specify .NET runtime directory.
CLR DLL status: ERROR: Unable to load DLL mscordacwks_x86_x86_4.7.3132.00.dll, Win32 error 0n87

“CLRDLL: Unable to get version info for 'f:\debug_symbol\symbols32\clr.dll\5B5543296ee000\mscordacwks_x86_x86_4.7.3132.00.dll"这里有个”5B5543296ee000“,于是我也在对应的目录下建立子文件夹”5B5543296ee000“,然后把两个文件考进去,再次执行.cordll -ve -u -l

 0:000:x86> .cordll -ve -u -l
CLRDLL: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll:4.8.4042.00 f:8
doesn't match desired version 4.7.3132.00 f:8
SYMSRV:  BYINDEX: 0x36
         f:\debug_symbol\symbols32
         mscordacwks_x86_x86_4.7.3132.00.dll
         5B5543296ee000
SYMSRV:  PATH: f:\debug_symbol\symbols32\mscordacwks_x86_x86_4.7.3132.00.dll\5B5543296ee000\mscordacwks_x86_x86_4.7.3132.00.dll
SYMSRV:  RESULT: 0x00000000
DBGHELP: f:\debug_symbol\symbols32\mscordacwks_x86_x86_4.7.3132.00.dll\5B5543296ee000\mscordacwks_x86_x86_4.7.3132.00.dll - OK
CLRDLL: Loaded DLL f:\debug_symbol\symbols32\mscordacwks_x86_x86_4.7.3132.00.dll\5B5543296ee000\mscordacwks_x86_x86_4.7.3132.00.dll
SYMSRV:  BYINDEX: 0x37
         f:\debug_symbol\symbols32
         SOS_x86_x86_4.7.3132.00.dll
         5B5543296ee000
SYMSRV:  PATH: f:\debug_symbol\symbols32\SOS_x86_x86_4.7.3132.00.dll\5B5543296ee000\SOS_x86_x86_4.7.3132.00.dll
SYMSRV:  RESULT: 0x00000000
DBGHELP: f:\debug_symbol\symbols32\SOS_x86_x86_4.7.3132.00.dll\5B5543296ee000\SOS_x86_x86_4.7.3132.00.dll - OK
Automatically loaded SOS Extension
CLR DLL status: Loaded DLL f:\debug_symbol\symbols32\mscordacwks_x86_x86_4.7.3132.00.dll\5B5543296ee000\mscordacwks_x86_x86_4.7.3132.00.dll
也就是加载成功了。

问题---“5B5543296ee000”文件夹名称是怎么来的?

加载成功,那么问题也随之而来---““5B5543296ee000”文件夹名称是怎么来的?”。

我注意到前面失败时的输出信息里:

“CLRDLL: Unable to get version info for 'f:\debug_symbol\symbols32\clr.dll\5B5543296ee000\mscordacwks_x86_x86_4.7.3132.00.dll"

对,还是这句话,不过这次的信息的重点不是“5B5543296ee000”,而是上面标粗的"clr.dll"了,它们能放在一起,说明一点:“5B5543296ee000”和“clr.dll”有关。

打开对应目录

查看下这个文件的属性

 处了版本是一样外,没有获得其他信息,后来我想到“5B5543296ee000”是不是跟一些PE信息有关呢?

打开命令行,定位到clr.dll的目录,执行“dumpbin /headers clr.dll

我注意到,在PE的FILE_HEADER里image timestamp的值为0x5B554329,在OPTIONAL HEADER里image size的值是0x6EE000,这两个值拼接在一起就是“5B5543296ee000”。

验证结论

我们上面的结论是对的吗?只能是在找一个相同结论的例子就可以,我找了之前windbg自行下载的

 

拿“”搜索,可以看到

也是这样的存储结构

dumpbin下clr.dll

根据之前的计算方式image timestamp和image size拼接为“5D490E656ef000”,完全正确,说明上面我们得出的结论完全正确

有许多选项可用于控制符号的加载和使用方式。这些选项可以通过多种方式设置。

下表列出了这些符号选项:

FlagOption NameDefault in debuggerDefault in DBH

0x1

SYMOPT_CASE_INSENSITIVE

On

On

0x2

SYMOPT_UNDNAME

On

On

0x4

SYMOPT_DEFERRED_LOADS

On

Off

0x8

SYMOPT_NO_CPP

Off

Off

0x10

SYMOPT_LOAD_LINES

Off in KD and CDB

On in WinDbg

On

0x20

SYMOPT_OMAP_FIND_NEAREST

On

Off

0x40

SYMOPT_LOAD_ANYTHING

Off

Off

0x80

SYMOPT_IGNORE_CVREC

Off

Off

0x100

SYMOPT_NO_UNQUALIFIED_LOADS

Off

Off

0x200

SYMOPT_FAIL_CRITICAL_ERRORS

On

Off

0x400

SYMOPT_EXACT_SYMBOLS

Off

On

0x800

SYMOPT_ALLOW_ABSOLUTE_SYMBOLS

Off

On

0x1000

SYMOPT_IGNORE_NT_SYMPATH

Off

Off

0x2000

SYMOPT_INCLUDE_32BIT_MODULES

Off

Off

0x4000

SYMOPT_PUBLICS_ONLY

Off

Off

0x8000

SYMOPT_NO_PUBLICS

Off

Off

0x10000

SYMOPT_AUTO_PUBLICS

On

On

0x20000

SYMOPT_NO_IMAGE_SEARCH

On

Off

0x40000

SYMOPT_SECURE

Off

Off

0x80000

SYMOPT_NO_PROMPTS

On in KD and CDB

Off in WinDbg

Off

0x80000000

SYMOPT_DEBUG

Off

Off

更改符号选项设置

.symopt(设置符号选项)命令可用于更改或显示符号选项设置。此外,可以使用许多命令行参数和命令来更改这些设置;这些参数和命令在各个SYMOPT_XXX部分中列出。
您还可以使用-sflagscommand-line选项同时控制所有设置。此选项后面可以跟一个十进制数,也可以跟一个前缀为0x的十六进制数。建议您使用十六进制,因为符号标志是以这种方式正确对齐的。使用此方法时要小心,因为它设置了整个位字段并将覆盖所有符号处理程序默认值。例如,-sflags 0x401不仅将启用SYMOPT_EXACT_SYMBOLS和SYMOPT_CASE_INSENSITIVE,而且还将禁用默认情况下正常打开的所有其他选项!
当这些程序在没有任何与符号相关的命令行选项的情况下启动时,WinDbg中的总标志位的默认值为0x30237,CDB和KD中的默认值为0xB0227,DBH工具中的默认值为0x10C13。

SYMOPT_CASE_INSENSITIVE

此符号选项导致对符号名的所有搜索都不区分大小写。默认情况下,在所有调试器中都启用此选项。调试器运行后,可以分别使用.symopt+0x1或.symopt-0x1来打开或关闭它。在DBH中,默认情况下启用此选项。一旦DBH运行,就可以分别使用symopt+1或symopt-1来打开或关闭它。

SYMOPT_UNDNAME

这个符号选择公共符号的名称在显示时被理解,原因搜索符号名称以忽略符号装饰。私人符号名称从来没有装饰过,请注意此选项是否有效。此选项适用于所有调试器。当调试器运行时,它可以通过SYMOPT+0x2或SYMOPT-0x2分别打开或关闭。这个选项在DBH中是默认打开的。如果使用了-d选项,就取消了。一旦DBH运行,它可以通过SYMOPT+2或SYMOPT+2打开或关闭。

SYMOPT_DEFERRED_LOADS

此符号选项称为延迟符号加载或延迟符号加载。当它处于活动状态时,在加载目标模块时不会实际加载符号。相反,调试器根据需要加载符号。默认情况下,在所有调试器中都启用此选项。在CDB和KD中,-s选项将关闭此选项。也可以在CDB中使用tools.ini文件中的LazyLoad变量来关闭它。调试器运行后,可以分别使用.symopt+0x4或.symopt-0x4来打开或关闭此选项。默认情况下,在DBH中此选项处于禁用状态。一旦DBH运行,就可以分别使用symopt+4或symopt-4来打开或关闭它。

SYMOPT_NO_CPP

这个符号选项关闭C++翻译。设置此符号选项时,所有符号中的::将替换为__ 。默认情况下,在所有调试器中都禁用此选项。它可以通过使用-snc选项激活。调试程序运行后,可以分别使用.symopt+0x8或.symopt-0x8来打开或关闭它。默认情况下,在DBH中此选项处于禁用状态。一旦DBH运行,就可以分别使用symopt+8或symopt-8来打开或关闭它。

SYMOPT_LOAD_LINES

此符号选项允许从源文件中读取行号信息。必须启用此选项,源调试才能正常工作。在KD和CDB中,此选项默认为关闭;在WinDbg中,此选项默认为打开。在CDB和KD中,-lines命令行选项将启用此选项。调试程序运行后,可以分别使用.symopt+0x10或.symopt-0x10来打开或关闭它。也可以使用.lines(Toggle Source Line Support)命令来打开和关闭它。在DBH中,默认情况下启用此选项。一旦DBH运行,就可以分别使用symopt+10或symopt-10来打开或关闭它。

SYMOPT_OMAP_FIND_NEAREST

当代码已优化且预期位置没有符号时,此选项将使用最近的符号。默认情况下,在所有调试器中都启用此选项。调试器运行后,可以分别使用.symopt+0x20或.symopt-0x20来打开或关闭它。在DBH中,默认情况下启用此选项。运行DBH之后,可以分别使用symopt+20或symopt-20来打开或关闭它。

SYMOPT_LOAD_ANYTHING

此符号选项可减少符号处理程序在尝试匹配符号时的挑剔程度。默认情况下,在所有调试器中都禁用此选项。调试程序运行后,可以分别使用.symopt+0x40或.symopt-0x40来打开或关闭它。默认情况下,在DBH中此选项处于禁用状态。一旦DBH运行,就可以分别使用symopt+40或symopt-40来打开或关闭它。

SYMOPT_IGNORE_CVREC

此符号选项使符号处理程序在搜索符号时忽略加载的image header中的CV记录。默认情况下,在所有调试器中都禁用此选项。它可以通过使用-sicv命令行选项激活。调试程序运行后,可以分别使用.symopt+0x80或.symopt-0x80来打开或关闭它。默认情况下,在DBH中此选项处于禁用状态。一旦DBH运行,就可以分别使用symopt+80或symopt-80来打开或关闭它。

SYMOPT_NO_UNQUALIFIED_LOADS

此符号选项禁用符号处理程序自动加载模块。当设置此选项并且调试器尝试匹配符号时,它将只搜索已加载的模块。此选项可用于防止错误输入符号名称。通常,键入错误的符号将导致调试器在搜索所有卸载的符号文件时暂停。当此选项处于活动状态时,在加载的模块中找不到键入错误的符号,然后搜索将终止。默认情况下,在所有调试器中都禁用此选项。它可以通过使用-snul命令行选项激活。调试器运行后,可以分别使用.symopt+0x100或.symopt-0x100来打开或关闭它。默认情况下,在DBH中此选项处于禁用状态。运行DBH之后,可以分别使用symopt+100或symopt-100来打开或关闭它。

SYMOPT_FAIL_CRITICAL_ERRORS

此符号选项将禁止显示文件访问错误对话框。如果禁用此选项,则在符号加载期间遇到的文件访问错误(如“驱动器未就绪”)将导致出现对话框。如果启用此选项,则这些框将被抑制,所有访问错误都将收到“失败”响应。默认情况下,在所有调试器中都启用此选项。可以使用-sdce命令行选项停用它。调试程序运行后,可以分别使用.symopt+0x200或.symopt-0x200来打开或关闭它。默认情况下,在DBH中此选项处于禁用状态。运行DBH之后,可以分别使用symopt+200或symopt-200来打开或关闭它。

SYMOPT_EXACT_SYMBOLS

此符号选项使调试器对所有符号文件执行严格的求值。启用此选项时,即使符号文件与符号处理程序的期望值之间存在微小差异,也会导致忽略符号。默认情况下,在所有调试器中都禁用此选项。它可以通过使用-ses命令行选项激活。调试程序运行后,可以分别使用.symopt+0x400或.symopt-0x400来打开或关闭它。-failinc命令行选项还可以打开SYMOPT_EXACT_SYMBOLS。此外,如果正在调试用户模式minidump或内核模式minidump,-failinc将阻止调试器加载其映像无法映射的任何模块。在DBH中,默认情况下启用此选项。一旦DBH运行,就可以分别使用symopt+400或symopt-400来打开或关闭它。

SYMOPT_ALLOW_ABSOLUTE_SYMBOLS

此符号选项允许DbgHelp读取存储在内存中绝对地址的符号。在绝大多数情况下不需要这种选择。默认情况下,在所有调试器中都禁用此选项。调试程序运行后,可以分别使用.symopt+0x800或.symopt-0x800来打开或关闭它。在DBH中,默认情况下启用此选项。一旦DBH运行,就可以分别使用symopt+800或symopt-800来打开或关闭它。

SYMOPT_IGNORE_NT_SYMPATH

此符号选项使调试器忽略符号路径和可执行映像路径的环境变量设置。默认情况下,在所有调试器中都禁用此选项。它可以通过使用-sins命令行选项激活。但是,一旦调试器运行,它就不能由.symopt控制,因为环境变量只在启动时读取。此选项在DBH中默认为禁用,在所有情况下都被DBH忽略。

SYMOPT_PUBLICS_ONLY

此符号选项使DbgHelp忽略私有符号数据,并仅搜索公共符号表以获取符号信息。这将在添加对这些类型的支持之前模拟DbgHelp的行为。默认情况下,在所有调试器中都禁用此选项。调试程序运行后,可以分别使用.symopt+0x4000或.symopt-0x4000来打开或关闭它。默认情况下,在DBH中此选项处于禁用状态。如果使用-d命令行选项,则该选项处于启用状态。一旦DBH运行,就可以分别使用symopt+4000或symopt-4000来打开或关闭它。

SYMOPT_NO_PUBLICS

此符号选项防止DbgHelp搜索公共符号表。这可以使符号枚举和符号搜索更快。如果您只关心搜索速度,则SYMOPT_AUTO_PUBLICS选项通常比此选项更可取。有关公共符号表的信息。默认情况下,在所有调试器中都禁用此选项。调试程序运行后,可以分别使用.symopt+0x8000或.symopt-0x8000来打开或关闭它。默认情况下,在DBH中此选项处于禁用状态。DBH运行后,可以分别使用symopt+8000或symopt-8000来打开或关闭它。

SYMOPT_AUTO_PUBLICS

此符号选项使DbgHelp只能作为最后的手段在.pdb文件中搜索公共符号表。如果在搜索专用符号数据时发现任何匹配项,则不会搜索公用符号。这提高了符号搜索速度。默认情况下,在所有调试器中都启用此选项。可以使用-sup命令行选项停用它。调试程序运行后,可以分别使用.symopt+0x10000或.symopt-0x10000来打开或关闭它。在DBH中,默认情况下启用此选项。如果使用-d命令行选项,则该选项将关闭。运行DBH之后,可以分别使用symopt+10000或symopt-10000来打开或关闭它。

SYMOPT_NO_IMAGE_SEARCH

此符号选项防止DbgHelp在加载符号时在磁盘中搜索image的副本。默认情况下,在所有调试器中都启用此选项。调试程序运行后,可以分别使用.symopt+0x20000或.symopt-0x20000来打开或关闭它。默认情况下,在DBH中此选项处于禁用状态。一旦DBH运行,就可以分别使用symopt+20000或symopt-20000来打开或关闭它。