Umdhtools.exe: 如何使用 Umdh.exe 来查找内存泄漏

文章翻译 文章翻译
文章编号: 268343 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

用户模式转储堆 (UMDH) 实用程序适用于分析 Windows 堆分配特定进程的操作系统。主要针对此实用程序,并与之关联的其他工具用于 Windows 2000 和 Windows XP。单击播放按钮以查看此流媒体演示。

注意ACELP ? 编解码器编码的视频,需要安装在可用的免费 ACELP ? 编解码器 http://www.acelp.net/acelp_eval.php



注意因为malloc函数中的 C 运行时 (CRT) 模块的 Windows Server 2003 的原始发行版使用帧指针省略 (FPO) 时,您可能看不到使用 UMDH 工具的malloc函数的完整堆栈信息。此问题已修复 Windows 2003 Service Pack 1 (SP1) 的 CRT 模块中。因此,您可以看到在 Windows Server 2003 SP1 的 malloc 函数的完整堆栈信息。

更多信息

使用 UMDH 前

如果您认为您会遇到内存泄漏,则应注意内存泄漏可能似乎是。您可能会发现,内存泄漏并不是真正的内存泄漏,但性能增强功能。对于示例中,Microsoft Jet 数据库引擎会占用大量的内存(最多 256 MB 的计算机上的 128 MB) 因为检索数据,并将写入高速缓存。缓存允许 Jet 引擎以获得快速预读和写预读缓冲。

若要确定遇到的一个过程内存泄漏,使用 Windows 性能监视器 (Perfmon.exe),并监视专用您的应用程序的进程类别下的字节数。专用字节是该过程已分配,但未与其他共享的内存总量处理。请注意这不同于虚拟字节,这也是有趣的监视。虚拟字节是当前大小 (以字节为单位)进程使用的虚拟地址空间。应用程序可以泄漏虚拟内存,但可能看不到分配的专用字节数中的差异。如果您看不到内存时监视专用字节,但又增加您仍在运行内存不足,监视虚拟字节,若要查看的可疑如果您正在使用的虚拟内存设置。检测内存泄漏和 Windows 性能监视器 (Perfmon.exe) 的概述有关的其他信息,请访问下面的 Microsoft 网站:
http://msdn.microsoft.com/en-us/library/ms404355.aspx
若要确保您的应用程序正在泄漏内存,请将怀疑与多个小版本,一个循环中的代码,然后监视 $ 专用和任何增加的内存的虚拟字节数。监视以确保数专用字节和虚拟字节不最终保持相同,数字停止增加。如果内存会停止点不断增加,(例如,它不再继续无限期地顺)?内存泄漏,但更有可能不会看到,您看到的增长到缓存其最大大小。

如果您确定您看到内存泄漏之前使用 UMDH,请按照下列步骤:
  1. 设置 UMDH 实用程序。
  2. 设置要包含的系统路径环境变量UMDH 的安装位置的文件夹。
  3. _NT_SYMBOL_PATH 环境变量设置为Microsoft 符号服务器路径,以便 UMDH 可以找到调试符号文件。
UMDH 实用程序是用于调试工具中包含Windows 产品在下面的 Microsoft 网站:
http://www.microsoft.com/whdc/devtools/ddk/default.mspx
下载并安装该实用程序,然后将路径系统设置对已安装调试工具的路径环境变量。

使用 UMDH,您必须先安装的正确调试符号您的应用程序和操作系统的组件。使用 Microsoft若要获取有关 Microsoft 组件的调试符号的符号服务器。 有关详细信息有关 Microsoft 符号服务器中,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
311503使用 Microsoft 符号服务器获取调试符号文件
UMDH 尝试使用找到的符号文件_NT_SYMBOL_PATH 环境变量。要设置的路径中的命令命令提示符处可能看上去如下所示:
设置 _NT_SYMBOL_PATH = SRV * c:\LocalSymbolCache
有关如何设置调试符号的其他信息信息,请参阅本文内下文中的"调试符号"部分。

完成这些步骤后,您就可以使用 UMDH 实用程序。

与 UMDH 捕获堆转储

UMDH 是一个实用工具,有关堆转储分配的过程。此信息包括每个调用堆栈分配,通过该调用堆栈,所做的分配数和通过该调用堆栈所使用的字节数。例如:
00005320 bytes in 0x14 allocations (@ 0x00000428) by: BackTrace00053
           ntdll!RtlDebugAllocateHeap+0x000000FD
           ntdll!RtlAllocateHeapSlowly+0x0000005A
           ntdll!RtlAllocateHeap+0x00000808
           MyApp!_heap_alloc_base+0x00000069
           MyApp!_heap_alloc_dbg+0x000001A2
           MyApp!_nh_malloc_dbg+0x00000023
           MyApp!_nh_malloc+0x00000016
           MyApp!operator new+0x0000000E
           MyApp!LeakyFunc+0x0000001E
           MyApp!main+0x0000002C
           MyApp!mainCRTStartup+0x000000FC
           KERNEL32!BaseProcessStart+0x0000003D
				
此 UMDH 输出显示了 21280 (0x5320) 分配的字节数从调用堆栈的总和。21280 字节分配从 20 (0x14)分隔的 1064 字节 (0x428) 的分配。在给定调用堆栈BackTrace00053 的标识符。

若要生成堆转储文件分配,则必须使用 Gflags.exe 实用程序,它还包含与Windows 调试工具产品,让操作系统知道您想要跟踪分配的内核。

假定您需要若要为 Notepad.exe 转储 heap(s) 内容。您必须先启用堆栈跟踪获取您要测试的应用程序。默认情况下此功能未启用。要启用此功能的命令如下所示:
gflags-i notepad.exe + 必须
该命令不会启用的进程的堆栈跟踪已在运行,但它使所有将来执行的堆栈跟踪Notepad.exe。 或者,您可以设置 GFLAGS 用户通过标志(不带任何参数来获取用户界面中运行 Gflags.exe) 的接口。使用-必须gflags 禁用堆栈跟踪,当您的选项完成调试。

当您设置 Gflags.exe,通过这些图像标志并设置调试符号,您就可以启动记事本 (应用程序正在使用 UMDH)。您必须启动该程序后,确定只需启动记事本进程的进程 ID (PID)。此命令时,如下所示:
tlist
您可以找到 PID TLIST 应用程序的输出中。PID 信息也可以获得在任务管理器中。假定为 PID您刚才启动记事本进程是 124。您可以使用 UMDH 来获取堆转储,使用以下命令:
umdh-p: 124-f:notepad124.log
结果: 必须在记事本过程的完整堆转储Notepad124.log 文件。此文件可用于显示所有已进行的分配和做分配调用堆栈。

使用 Umdh.exe 来比较 UMDH 日志

而 UMDH 日志文件有关包含有价值的信息当前状态的过程中,如果您正在寻找关心堆内存泄漏,它可能会更有价值,以比较两个日志的输出和找出哪些调用堆栈过两个转储文件之间的最大增长。Umdh.exe 实用程序有助于比较两个 UMDH 日志提供的分析它们之间的区别。有两种日志捕获在不同的一次时间间隔,然后可以使用以下命令:
UMDH dh1.log dh2.log > cmp12.txt
-或者-
UMDH-d dh1.log dh2.log > cmp12.txt
-D命令行选项告诉 UMDH,而不是十进制形式显示十六进制。命令的输出进行比较的差异分配两个记录,并提供了类似的信息以下几种:
+ 5320 (f110-9df0) 3a 独占分配 BackTrace00053总增加 = = 5320
为 UMDH 的日志文件中的每个回溯,是比较两个日志文件之间进行。这种情况下显示的是最后一个日志文件在 UMDH 中指定命令行有 0xF110 个字节时第一个分配日志在 UMDH 命令行中的有 0x9DF0 个字节分配给同一个反向跟踪(调用堆栈)。"5320"是分配的字节数中的差异。在中这种情况下,没有时间之间分配更多字节的 0x5320,两个日志捕获。来自所标识的调用堆栈的字节数"BackTrace00053"。

下一步是找出中的反向跟踪。如果您打开的第二个日志文件和BackTrace00053的搜索,您可能会发现这类似于以下:
00005320 bytes in 0x14 allocations (@ 0x00000428) by: BackTrace00053
           ntdll!RtlDebugAllocateHeap+0x000000FD
           ntdll!RtlAllocateHeapSlowly+0x0000005A
           ntdll!RtlAllocateHeap+0x00000808
           MyApp!_heap_alloc_base+0x00000069
           MyApp!_heap_alloc_dbg+0x000001A2
           MyApp!_nh_malloc_dbg+0x00000023
           MyApp!_nh_malloc+0x00000016
           MyApp!operator new+0x0000000E
           MyApp!LeakyFunc+0x0000001E
           MyApp!main+0x0000002C
           MyApp!mainCRTStartup+0x000000FC
           KERNEL32!BaseProcessStart+0x0000003D
				
当您查看调用堆栈时,您可以看到LeakyFunc函数分配内存通过 Visual C++ 的运行时库新的运算符函数。如果您发现的分配数的增加以及您需要更多的转储文件,可能会得出结论: 内存不释放。

启用堆栈跟踪

UMDH 日志中最重要的信息是堆栈跟踪堆分配。您可以分析这些验证过程是否泄漏堆内存。默认情况下,不会获取这些堆栈跟踪信息。启用该功能每个进程或系统范围内的功能。使用以下命令启用堆栈跟踪系统范围内:
gflags-r + 必须
此命令后,重新启动计算机。为每个进程启用后,该命令如下所示:
gflags-i应用程序名+ 必须
其中应用程序名是包括的扩展名 (可执行文件的文件名例如,检测,Lsass.exe)。该命令不会启用堆栈跟踪对于已在运行的进程。因此,对于不能这样的进程(有关示例、 服务、 lsass,winlogon) 重新启动,您必须重新启动您的测试计算机。

使用以下命令验证设置了什么已设置系统范围或特定进程: 系统范围内:
gflags-r
特定进程:
gflags-i 应用程序名称
默认情况下的最大堆栈跟踪深度为 16。如果您希望请参见更深层次的调用堆栈,这可以通过运行 GFLAGS 增加。单击以选中系统注册表,然后键入新最大深度。堆栈跟踪捕获深度编辑控件。单击应用,然后重新启动计算机。
重要提示: 如果您使用的 Windows NT 4.0 服务包 6,则必须使用Umdh_nt4.exe,而不是 Umdh.exe,并且您必须使用 gflags-r 若要设置系统范围内的堆栈跟踪的命令。请确保您重新启动计算机。在不运行 Umdh_nt4 堆栈跟踪每个进程Windows NT 版本 4 的基础。它必须设置为整个系统。

调试符号

使用 UMDH 的最重要的步骤之一是确保您具有正确的符号文件 (.dbg 或.pdb 文件) 以获得良好的堆栈跟踪。至少,您需要的 Kernel32.dbg 和 Ntdll.dbg 的符号文件。您可以获取您可能需要为您找出更多的附加调试符号有关哪些组件会泄漏内存。 有关详细信息有关如何获取有关 Microsoft 的调试符号文件组件,单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
311503使用 Microsoft 符号服务器获取调试符号文件
有关如何使用的其他信息Microsoft 符号服务器以及如何获取 Windows 符号文件包,请访问下面的 Microsoft 网站:
http://www.microsoft.com/whdc/devtools/ddk/default.mspx
在生成与 Visual C++ 组件时,很重要的您没有程序数据库以进行编辑并继续选择 c + +编译器选项。相反,选择程序数据库。若要设置符号路径,要使用的路径的 _NT_SYMBOL_PATH 环境变量进行初始化。您可以使用 Microsoft 符号服务器来获取有关 Microsoft 的符号组件。
311503 使用 Microsoft 符号服务器获取调试符号文件
请按照下列步骤来设置 _NT_SYMBOL_PATH环境变量:
  1. 在控制面板中,双击系统
  2. 单击高级选项卡,然后单击环境变量。
也可以设置 _NT_SYMBOL_PATH 环境变量命令窗口运行 UMDH 之前。

注意: 还包含的路径中的组件的 Pdb 您应用程序。例如,为设置路径 _NT_SYMBOL_PATH 所示:
SRV*c:\symbols*http://msdl.microsoft.com/download/symbols;c:\myapplicationssymbols
此路径的第一部分指向 Microsoft 符号服务器和使用的符号将在 c:\symbols 下载状态文件夹。后面的分号的部分是 PDB 文件的路径(符号文件) 专门为泄漏的应用程序。

调用 UMDH

唯一必需的命令行参数 UMDH 是-p选项,指定从该进程的 PID 堆将获取转储。可通过使用任务管理器中获得 PID 或Tlist.exe 程序。对于类似于下面的命令,将该日志转储到标准输出:
umdh-p: PID
UMDH 还显示为标准的各种信息性消息错误,并且因此如果不进行定向,它混合的真实的日志。若要收集 UMDH 文件中的信息性消息,请使用以下命令:
umdh-p: PID 2>umdh.msg
如果您想要收集转储到文件中的 UMDH 时的日志使用下列命令之一:
umdh-p: PID > umdh.log
-或者-
umdh-p: PID-f:umdh.log
这些命令是等效的。

是默认的日志通过获得 UMDH 包含排序依据的堆消费者的枚举分配计数。如果出于调试目的,您还需要所有的转储文件分配的块和其相应的堆栈跟踪,可以使用-d选项:
umdh-p: PID d
如果使用此命令时,您可能会看到以下 UMDH日志文件:
分配用于跟踪 BackTrace00046: 005F69A0005F6150
这些都是为该分配的内存地址调用堆栈。如果您的调试器附加到进程中,您可转储若要查看已分配什么这些地址的内存的内容。

如果日志中包含太多的信息,它可以是仅限于分配的大用户计数某些阈值以上。使用下面的命令:
umdh-p: PID t: 阈值
所有命令行选项 (例如, -p、-f-t、-d) 可以被同时按任意顺序指定。下面是更难的命令行示例:
umdh-p: 123-t: 1000-f:umdh.log-d
此命令将转储到 PID 为 123 的进程堆Umdh.log 文件中。将它转储只堆栈跟踪该帐户超过 1000年个分配和它还将转储堆块的地址分配到每个堆栈跟踪。

另一个有用的 UMDH 选项-l选项。这会导致在打印的文件和行号只要可能,就调用堆栈。

UMDH 输出说明

如果您重定向到文件日志 (umdh-p: PID-f:umdh.log) 的内容可能会类似于以下,获得从正在运行的记事本进程:
UMDH: Logtime 2000-06-28 10:54 - Machine=MYMachine - PID=704
   *********** Heap 00270000 Information ********************
       Flags: 58000062
       Number Of Entries: 87
       Number Of Tags: <unknown>
       Bytes Allocated: 00008DF0
       Bytes Committed: 0000A000
       Total FreeSpace: 00001210
       Number of Virtual Address chunks used: 1
       Address Space Used: <unknown>
       Entry Overhead: 8
       Creator:  (Backtrace00007)
           ntdll!RtlDebugCreateHeap+0x00000196
           ntdll!RtlCreateHeap+0x0000023F
           ntdll!LdrpInitializeProcess+0x00000369
           ntdll!LdrpInitialize+0x0000028D
           ntdll!KiUserApcDispatcher+0x00000007
   *********** Heap 00270000 Hogs ********************
   000001A0 bytes in 0x4 allocations (@ 0x00000068) by: BackTrace00031
           ntdll!RtlDebugAllocateHeap+0x000000FB
           ntdll!RtlAllocateHeapSlowly+0x0000005B
           ntdll!RtlAllocateHeap+0x00000D81
           ntdll!LdrpAllocateDataTableEntry+0x00000039
           ntdll!LdrpMapDll+0x000002A4
           ntdll!LdrpLoadImportModule+0x0000010D
           ntdll!LdrpWalkImportDescriptor+0x0000008B
           ntdll!LdrpLoadImportModule+0x0000011D
           ntdll!LdrpWalkImportDescriptor+0x0000008B
           ntdll!LdrpLoadImportModule+0x0000011D
           ntdll!LdrpWalkImportDescriptor+0x0000008B
           ntdll!LdrpInitializeProcess+0x000009DC
           ntdll!LdrpInitialize+0x0000028D
           ntdll!KiUserApcDispatcher+0x00000007

   000001A0 bytes in 0x4 allocations (@ 0x00000068) by: BackTrace00034
           ntdll!RtlDebugAllocateHeap+0x000000FB
           ntdll!RtlAllocateHeapSlowly+0x0000005B
           ntdll!RtlAllocateHeap+0x00000D81
           ntdll!LdrpAllocateDataTableEntry+0x00000039
           ntdll!LdrpMapDll+0x000002A4
           ntdll!LdrpLoadImportModule+0x0000010D
           ntdll!LdrpWalkImportDescriptor+0x0000008B
           ntdll!LdrpLoadImportModule+0x0000011D
           ntdll!LdrpWalkImportDescriptor+0x0000008B
           ntdll!LdrpLoadImportModule+0x0000011D
           ntdll!LdrpWalkImportDescriptor+0x0000008B
           ntdll!LdrpLoadImportModule+0x0000011D
           ntdll!LdrpWalkImportDescriptor+0x0000008B
           ntdll!LdrpInitializeProcess+0x000009DC
           ntdll!LdrpInitialize+0x0000028D
           ntdll!KiUserApcDispatcher+0x00000007
				
日志中包含每个进程中的堆的转储。在此示例中,在日志开始与地址 270000 堆集。之后的几个全局计数器堆中,该日志包含按递减的排序顺序的堆栈跟踪转储大多数分配的负责。当您进行比较的动态在不同时间,使用的内存可以推断出中发生的问题进程,如果任何堆使用类似于泄漏。

可以使用 UMDH 时遇到的问题

当您使用 UMDH 时最常见的错误原因是堆栈未启用跟踪。此外,不正确的符号 Ntdll.dll 阻止从 UMDH在运行。对于其他符号文件,运行 UMDH,但日志文件包含堆栈而是没有函数名称的跟踪对相对地址在模块内。距离较远的第三个错误指定错误的 PID。以下当您尝试运行一个过程,它不具有 UMDH 会产生错误消息启用堆栈跟踪:
C:\>umdh-p: 1140 UMDH: Logtime2000-06-28 12: 43-机器 = MyMachine-PID = 1140年连接...模块枚举已完成。SymGetSymFromName (进程、 ntdll!RtlpStackTraceDataBase,xxx) 失败,LastError = 126 UmdhGetAddrFromName 找不到堆栈跟踪数据库指针 (ntdll!RtlpStackTraceDataBase)。ntdll.dll 符号不正确 ;我们必须能够查看未导入的符号。
使用以下命令请仔细检查正在调查进程的设置:
gflags-i 应用程序名
依靠系统堆栈时,请使用下面的命令跟踪:
gflags-r
这些命令显示标志设置为应用程序的列表。请注意,在系统范围内的堆栈跟踪的情况下,该功能可能会显示为但如果您未重新启动计算机后运行命令gflags r + 必须处于活动状态,它是不实际激活。如果您想要知道每个已启用的堆栈跟踪的应用程序,您可以查看的 USTEnabled 键在以下注册表项中:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image 文件执行选项
如果已启用,堆栈跟踪的进程上运行 UMDH,但由于您设置的标志不重新启动应用程序,您可能会收到下面的消息日志中:
堆栈跟踪程序不保存对分配 (索引 = = 0)
如果您运行未设置您可能正确的符号路径或符号不正确,并且您运行 UMDH,在日志中收到一条错误消息。但是,您可能只收到不正确或令人误解的调用堆栈。若要验证您具有正确的符号,请启动NTSD 系统调试进程,例如:
ntsd 记事本
然后,调试器控制台中,从要加载的模块的符号信息的LD命令以及运行LM命令列出模块已加载的符号。如果LM命令的输出将显示导出符号加载,这些符号不会很好。如果已加载的 PDB 符号,这些符号是很好。您可能会收到下面的错误消息如果指定了错误的 PID:
C:\>umdh-p: 1000 UMDH: Logtime 2000-06-28 日 09: 45-机器 = MyMachine-PID = 1000年连接...失败的 OpenProcess,LastError = 0x57

从 Visual Basic 调用 UMDH

可能有时需要随着时间的推移转储日志数由于泄漏可能不是很明显,因此在第一。例如,如果您怀疑 Active Server Pages (ASP) Web 应用程序正在泄漏内存,它可能有助于编写 COM 组件中给出 shells 的 Visual BasicUMDH。然后,可以从您的 ASP 页中调用该组件。

"以下是一些 Visual Basic 的代码调用 UMDH,并创建日志文件它基于当前时间:
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
      Public Function GetProcessID()
      GetProcessID = GetCurrentProcessId()
      End Function  
   .
   .
   .
      Dim strTime As String

      Dim sProcID As String
      sProcID = GetProcessID()
      strTime = "MYLOG_" & Format(Now(), "hhmm")
     
      Shell ("C:\UMDH\umdh -p:" & sProcID & " -f:d:\logs\" & strTime & ".txt")
				

使用 Windows NT 4.0 Service Pack 6a UMDH (SP6a)

UMDH 实用程序所包含的调试工具在 Windows NT 4.0 Windows 产品都无法正常工作。自解压可执行文件这篇文章中包含 (Umdhnt4tools.exe),并包含以下在 NT 4.0 上使用的工具:
  • Umdh_nt4.exe 和 Dbghelp.dll
    这是 Windows NT4.0 SP6 版本的 UMDH 实用程序。
  • Dhcmp.exe
    此实用程序用于比较两个 UMDH转储以确定其中可能的内存泄漏发生时。
"下面的文件是可从 Microsoft 下载下载中心:
收起这个图片展开这个图片
下载
立即下载 Umdhnt4tools.exe
发布日期: 2002 年 8 月 28日日

有关如何下载 Microsoft 支持文件的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
119591 如何从联机服务获得 Microsoft 支持文件
Microsoft 扫描此文件中的病毒。Microsoft 使用该文件被发送的日期都不可用的最新病毒检测软件。该文件保存在安全性得到增强的服务器上,有助于防止对文件进行任何未经授权的更改。 将 Umdh_nt4.exe 和 Dbghelp.dll 放在一个文件夹,然后第一次就放在 PATH 环境变量中。而不是使用 Umdh_nt4.exeUMDH。

计算机上运行的 Windows NT 4.0,您必须使用若要设置系统范围内的堆栈跟踪的 Gflags.exe。例如:
gflags-r
请确保在重新启动计算机。Umdh_nt4 堆栈跟踪不工作 Windows NT 4.0 版上的每个进程的基础。设置为整个系统。

UMDH_NT4 是与 UMDH 不同,不是日志文件进行比较。例如,不能执行以下操作:
UMDH_NT4 dh1.log dh2.log > cmp12.txt
相反,您必须使用与所包含的 Dhcmp.exe 实用程序这篇文章。该命令看起来如下所示:
DHCMP dh1.log dh2.log > cmp12.txt

属性

文章编号: 268343 - 最后修改: 2012年9月30日 - 修订: 3.0
这篇文章中的信息适用于:
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows NT Server 4.0 Standard Edition
  • Microsoft Windows NT Workstation 4.0 开发员版
关键字:?
kbdownload kbarttypeshowme kbfile kbgraphxlinkcritical kbhowto kbsample kbmt KB268343 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 268343
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com