本文介绍如何配置 SQL Server Analysis Services 以自动生成内存转储文件。
原始产品版本:SQL Server
原始 KB 数: 919711
简介
本文介绍如何配置 Microsoft SQL Server Analysis Services (SSAS) 2012 或更高版本,以在遇到异常时自动生成不同类型的内存转储文件。 本文还概述了如何使用 Sqldumper.exe 实用工具手动获取 SQL Server Analysis Services 进程的内存转储文件。
详细信息
默认情况下,SQL Server Analysis Services 会在发生异常时自动生成小型转储文件。 对于默认安装,小型转储文件将写入默认位置:
Analysis Services 版本 | 位置 |
---|---|
2019 | %ProgramFiles%\Microsoft SQL Server\MSAS15.InstanceName\OLAP\log |
2017 | %ProgramFiles%\Microsoft SQL Server\MSAS14.InstanceName\OLAP\log |
2016 | %ProgramFiles%\Microsoft SQL Server MSAS13.InstanceName\OLAP\log |
2014 | %ProgramFiles%\Microsoft SQL Server MSAS12.InstanceName\OLAP\log |
2012 | %ProgramFiles%\Microsoft SQL Server MSAS11.InstanceName\OLAP\log |
注意
InstanceName 是 SQL Server Analysis Services 版本的相应值的占位符。
安装后可以更改 SQL Server Analysis Services 实例日志位置,因此可以通过查看已安装 SQL Server Analysis Services 的msmdsrv.ini文件来验证日志位置。
若要确定系统的相应值,请确定 ImagePath 注册键的值,它应包含包含msmdsrv.ini的 Config 路径的路径。
Analysis Services 版本 | 注册表子项 |
---|---|
默认实例 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQLServerOLAPService\ImagePath |
命名实例 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSOLAP$InstanceName\ImagePath |
小型转储文件将包含以下信息:
所有线程堆栈
堆栈上的指针引用的二阶内存
有关进程环境块(PEB)的信息
有关线程环境块(TEB) 的信息
有关最近卸载的模块的信息
线程状态信息
Msmdsrv.ini文件中的“异常”部分控制内存转储文件生成。 默认情况下,该文件位于 %ProgramFiles%\Microsoft SQL Server\MSASxx.InstanceName\OLAP\Config
文件夹中。 MSASxx 是 SQL Server Analysis Service 的相应版本的占位符。 在记事本中打开文件时,你会注意到异常 XML 标记中的一个部分,如下所示:
<Exception>
<CreateAndSendCrashReports>1</CreateAndSendCrashReports>
<CrashReportsFolder/>
<SQLDumperFlagsOn>0x0</SQLDumperFlagsOn>
<SQLDumperFlagsOff>0x0</SQLDumperFlagsOff>
<MiniDumpFlagsOn>0x0</MiniDumpFlagsOn>
<MiniDumpFlagsOff>0x0</MiniDumpFlagsOff>
<MinidumpErrorList>0xC1000000, 0xC1000001, 0xC1000016, 0xC11D0005, 0xC102003F</MinidumpErrorList>
<ExceptionHandlingMode>0</ExceptionHandlingMode>
<CriticalErrorHandling>1</CriticalErrorHandling>
</Exception>
可以通过修改本节中的设置来控制生成内存转储文件的行为。 还可以在 SQL Server Management Studio 中修改这些设置。 有关这些设置的详细信息,请访问 SQL Server Management Studio 下载网站: 日志属性。
禁用 Analysis Services 的自动内存转储文件
CreateAndSendCrashReports 设置的值确定是否将生成内存转储文件。 此设置可以包含下表中列出的值之一。
值 | 说明 |
---|---|
0 | 此值指定 Analysis Services 不生成任何内存转储文件。 此外,“异常”部分下的其他设置的值将被忽略。 |
1 | 此默认值启用内存转储文件。 但是,SQL Server Analysis Services 不会将错误报告发送到Microsoft。 |
2 | 此值指定 SQL Server Analysis Services 生成内存转储文件,并将错误报告发送到Microsoft。 |
当 CreateAndSendCrashReports 设置设置为 1 或 2 时,Exception 节中的其他设置可以控制内存转储文件的类型以及要包含在内存转储文件中的信息。
配置 SQL Server Analysis Services 以自动生成完整转储文件
若要将 SQL Server Analysis Services 配置为在发生异常时自动生成完整转储文件,可以将 SQLDumperFlagsOn 设置设置为0x34。 此外,如果要将 SQL Server Analysis Services 配置为生成包含句柄信息的完整转储文件,可以将 SQLDumperFlagsOn 设置设置为0x34,将 MiniDumpFlagsOn 设置设置为0x4。 例如,Msmdsrv.ini文件中的“异常”部分可能如下所示:
<Exception>
<CreateAndSendCrashReports>1</CreateAndSendCrashReports>
<CrashReportsFolder/>
<SQLDumperFlagsOn>0x34</SQLDumperFlagsOn>
<SQLDumperFlagsOff>0x0</SQLDumperFlagsOff>
<MiniDumpFlagsOn>0x4</MiniDumpFlagsOn>
<MiniDumpFlagsOff>0x0</MiniDumpFlagsOff>
<MinidumpErrorList>0xC1000000, 0xC1000001, 0xC1000016, 0xC11D0005, 0xC102003F</MinidumpErrorList>
<ExceptionHandlingMode>0</ExceptionHandlingMode>
<CriticalErrorHandling>1</CriticalErrorHandling>
</Exception>
生成包含手动处理信息的完整转储文件
若要排查停止响应(挂起)的服务器等问题,可能需要生成包含手动处理信息的完整转储文件。 为此,可以在命令提示符处运行 Sqldumper.exe 实用工具以及下列参数:
Sqldumper.exe PID 0 0x34:0x4 0 PathToDumpFile
注意
PID 表示 SQL Server Analysis Services 进程的进程 ID。 PathToDumpFile 表示将转储文件写入到的文件夹。
必须从安装了实例的共享目录运行此命令,或者必须在命令中指定Sqldumper.exe文件的完整路径。
Analysis Services 版本 | 位置 |
---|---|
2019 | %ProgramFiles%\Microsoft SQL Server\150\Shared |
2017 | %ProgramFiles%\Microsoft SQL Server\140\Shared |
2016 | %ProgramFiles%\Microsoft SQL Server\130\Shared |
2014 | %ProgramFiles%\Microsoft SQL Server\120\Shared |
2012 | %ProgramFiles%\Microsoft SQL Server\110\Shared |
例如,要为 SQL Server Analysis Services 2019 运行sqldumper.exe的默认目录为 C:\Program Files\Microsoft SQL Server\1590\Shared
。
更多信息
可以使用 SQLDumperFlagsOn 设置指定各种 SQLDumper 标志。 下表列出了可以用作标志参数值的位掩码值。
助记名称 | 十六进制值 | 说明 |
---|---|---|
SQLDUMPER_DBGBREAK | 0x0001 | 此标志会导致分析参数时,Sqldumper.exe实用工具在程序开始时运行 DebugBreak API 调用。 通常,Microsoft产品支持服务专业人员不会使用此标志,因为该标志仅用于调试Sqldumper.exe实用工具问题。 请注意 ,此标志会进入Sqldumper.exe进程。 此标志不会中断Sqldumper.exe实用工具正在调试的进程。 |
SQLDUMPER_NOMINIDUMP | 0x0002 | 使用此标志时,Sqldumper.exe实用工具不会生成转储文件。 此标志用于测试Sqldumper.exe实用工具。 |
SQLDUMPER_NOWATSON | 0x0004 | 通常,手动生成转储文件时会使用此标志。 此标志替代默认错误报告行为。 默认情况下,转储文件提交到注册表中配置的错误报告站点。 |
SQLDUMPER_REFERENCED_MEMORY | 0x0008 | 此标志会导致Sqldumper.exe实用工具在调用 MiniDumpWritedump 函数时为 MiniDumpType 参数设置 MiniDumpWithIndirectlyReferencedMemory 标志。 基于堆栈的指针(仅一个级别)的内存(参数或局部变量)将存储在转储文件中。 测试显示,某些基于线程本地存储(TLS)数据的本地参数(例如概率签名方案(PSS)和 EC 结构似乎不起作用,即使设置了此标志也是如此。 |
SQLDUMPER_ALL_MEMORY | 0x0010 | 当实用工具调用 MiniDumpWriteDump 函数时,此标志会导致Sqldumper.exe实用工具为 MiniDumpType 设置MiniDumpWithFullMemory 标志。 此行为与在调试器下使用 .dump /mf 命令相同。 但是,还必须将SQLDUMPER_DUMP_ALL_THREADS标志设置为打开,以确保包括所有线程堆栈。 |
SQLDUMPER_DUMP_ALL_THREADS | 0x0020 | 手动运行 Sqldumper.exe 实用工具并指定 ThreadId 参数值 0 时,不需要此标志。 ThreadId 参数值为 0 表示应转储所有线程。 如果指定了特定的非零 ThreadId 参数值,但还使用此标志,则所有线程都会写入转储文件。 之所以存在此标志,是因为Sqlservr.exe进程中的典型行为是传入生成Sqlservr.exe进程的线程的当前 ThreadId 属性值。 发生此行为时,需要标记作为转储所有线程的选项。 |
SQLDUMPER_MATCH_FILE_NAME | 0x0040 | 可以使用此标志尝试强制Sqldumper.exe实用工具生成类似于特定命名约定的转储文件名。 此特定命名约定可能基于现有文件名。 由于必须设置一个特殊的内存结构,该结构包含自己的程序中的现有文件名,然后将该指针作为 SqlInfoPtr 参数传递给 Sqldumper.exe 实用工具,因此在手动运行 Sqldumper.exe 实用工具时,此标志将无效。 |
SQLDUMPER_SKIP_DW_REG_READ | 0x0080 | 此标志会导致Sqldumper.exe实用工具不使用注册表作为执行Dw15.exe程序的路径。 Dw15.exe程序用于将转储文件上传到错误报告站点。 |
SQLDUMPER_VERBOSE | 0x0100 | 如果不确定Sqldumper.exe实用工具认为用作输入的参数,则此标志可能很有价值。 使用此标志时,Sqldumper.exe实用工具会显示参数值,以及从命令行指定了多少个参数值。 |
SQLDUMPER_WAIT_AT_EXIT | 0x0200 | 可以使用此标志将调试器附加到Sqldumper.exe实用工具。 可以使用此调试器来排查Sqldumper.exe实用工具的任何问题。 当Sqlservr.exe或其他程序生成Sqldumper.exe实用工具时,可能会出现这些问题。 设置此标志时,Sqldumper.exe实用工具在Sqldumper.exe程序存在之前调用 SleepEx 函数 15 秒,并在完成所有其他操作之后调用 SleepEx 函数。 |
SQLDUMPER_FILTERED | 0x0800 | 可以使用此标志生成筛选的转储文件。 SQL Server Analysis Services 尚不支持此标志。 |
可以使用 MiniDumpFlagsOn 设置来提供小型转储标志。 下表列出了可用的小型转储标志:
选项 | 值 | 说明 |
---|---|---|
MiniDumpNormal | 0x00000000 | 创建使用覆盖的典型微型转储文件。 |
MiniDumpWithDataSegs | 0x00000001 | 包括所有已加载模块的数据段。 加载的模块检索全局变量的标志。 |
MiniDumpWithFullMemory | 0x00000002 | 创建完整的用户转储文件。 设置标志时,将禁用筛选的转储文件。 |
MiniDumpWithHandleData | 0x00000004 | 包括句柄信息。 |
MiniDumpFilterMemory | 0x00000010 | 应扫描堆栈和后盾存储内存,以查找对模块列表中的模块的指针引用。 用户不应将此标志用于 SQL Server Analysis Services。 |
MiniDumpWithUnloadedModules | 0x00000020 | 此标志提供有关最近卸载的模块的信息。 仅Microsoft Windows XP 和 Microsoft Windows Server 2003 支持此标志。 在 Windows Server 2003 Service Pack 1(SP1)和 Windows XP Service Pack 2(SP2)之前,操作系统不会维护卸载模块的信息。 |
MiniDumpWithIndirectlyReferencedMemory | 0x00000040 | 包括包含局部变量或其他堆栈内存引用的数据的页面。 |
MiniDumpFilterModulePaths | 0x00000080 | 如果模块路径从模块信息中剥离,请不要使用此标志。 |
MiniDumpWithProcessThreadData | 0x00000100 | 此标志提供有关进程环境块(PEB)和线程环境块(TEB)的信息。 |
MiniDumpWithPrivateReadWriteMemory | 0x00000200 | 扫描虚拟地址空间以查找要包含的其他类型的内存。 |
MiniDumpWithoutOptionalData | 0x00000400 | 通过消除不需要的内存区域来减少转储的数据。 执行此操作以满足为转储文件指定的条件。 使用此标志可以避免转储内存,这些内存可能包含对用户专用的数据。 但是,这不能保证不会提供任何私人信息。 请勿使用此标志。 |
MiniDumpWithFullMemoryInfo | 0x00000800 | 包括枚举的内存区域描述性信息。 |
MiniDumpWithThreadInfo | 0x00001000 | 包括线程状态信息。 |
MiniDumpWithCodeSegs | 0x00002000 | 包括所有已加载模块的代码和与代码相关的部分。 |