Procdump 写入转储文件时出错:0x80070005 错误 0x80070005 (-2147024891):访问被拒绝

Procdump Error writing dump file: 0x80070005 Error 0x80070005 (-2147024891): Access is denied

最近我们在尝试为 2012 R2 服务器上的各种 IIS 应用程序池捕获内存转储时遇到了问题。我试过使用任务管理器,但它会产生错误,以及在管理控制台中使用 procdump:

PS C:\Users\_______\Downloads> procdump -mA 31016

ProcDump v7.1 - Writes process dump files
Copyright (C) 2009-2014 Mark Russinovich
Sysinternals - www.sysinternals.com
With contributions from Andrew Richards

[19:59:22] Dump 1 initiated: C:\Users\____\Downloads\w3wp.exe_161008_195922.dmp
[19:59:25] Dump 1 writing: Estimated dump file size is 29278 MB.
[20:01:15] Dump 1 error: Error writing dump file: 0x80070005
Error 0x80070005 (-2147024891): Access is denied.

[20:01:15] Waiting for dump to complete...
[20:01:17] Dump count not reached.

我已经尝试了 -ma 和 -mA 以及 -64 和 procdump64 的各种组合,但它们都具有相同的访问被拒绝的工作进程使用超过 ~16GB 内存的错误。

我也尝试将 -r 添加到 reflect/clone How to: Take a Memory Dump of an ASP.NET Application Pool Quickly 推荐的过程中,但仍然收到与上述相同的错误消息。

更新: 所以默认情况下,如果 IIS 应用程序池在 90 秒内没有响应正在进行的内部 ping 请求,它们将被回收。您可以在高级设置中看到:

大约 90 秒后出现错误消息,很可能这就是问题的原因。

所以发生的事情是 procdump 暂停工作进程,阻止它响应内部 ping,即使在使用 -r reflect/clone 选项时也是如此。如果将内存写入转储文件的时间超过 90 秒,则 IIS 将回收工作进程,导致旧进程终止。 Procdump 然后 returns 一条“拒绝访问”或 "Only part of a ReadProcessMemory or WriteProcessMemory request was completed" 错误消息,因为它试图读取的内存不再分配并且进程不再存在。

要解决此问题,您可以使用 Resource Monitor, Process Explorer or PsSuspend 同时暂停 svchost.exe -k iissvcs 进程,这样它就不会中断 procdump 进程。以下 PowerShell 脚本可以在管理控制台中 运行 创建具有最大工作集的 w3wp 进程的内存转储:

#Prevent IIS from recycling the process during procdump and causing an Access Denied error message
$iispid = Get-Process svchost | ?{$_.modules.ModuleName -eq "iisw3adm.dll"} | Select -First 1 -ExpandProperty Id
$workerpid = Get-Process w3wp | Sort ws -Descending | Select -First 1 -ExpandProperty Id
cd ~\Downloads  #move to location where you want to save the dump files
#Add -accepteula to the sysinternals calls if you want to bypass the initial EULA prompt on new servers
& "c:\sysinternals\pssuspend.exe" $iispid 
Write-Output "Creating memory dump for w3wp PID $workerpid"
& "c:\sysinternals\procdump.exe" -ma $workerpid
& "c:\sysinternals\pssuspend.exe" $iispid -r

输出应如下所示:

PS> & "\dfshare\sysinternals\pssuspend.exe" $iispid

PsSuspend v1.06 - Process Suspender
Copyright ⌐ 2001-2003 Mark Russinovich
Sysinternals

Process 49836 suspended.

PS> & "\dfshare\sysinternals\procdump.exe" -ma 98340

ProcDump v8.2 - Sysinternals process dump utility
Copyright (C) 2009-2016 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com

[01:03:24] Dump 1 initiated: C:\Users\gbray\Downloads\w3wp.exe_161230_010324.dmp
[01:03:29] Dump 1 writing: Estimated dump file size is 19347 MB.
[01:05:14] Dump 1 complete: 19350 MB written in 109.8 seconds
[01:05:14] Dump count reached.

PS> & "\dfshare\sysinternals\pssuspend.exe" $iispid -r

PsSuspend v1.06 - Process Suspender
Copyright ⌐ 2001-2003 Mark Russinovich
Sysinternals

Process 49836 resumed.

我不知道挂起 iissvcs 进程可能会产生什么其他问题,因此最好在创建内存转储后 运行 iisreset