Ошибка Procdump при записи файла дампа: 0x80070005 Ошибка 0x80070005 (-2147024891): доступ запрещен
Недавно у нас возникли проблемы при попытке получить дамп памяти для различных пулов приложений IIS на сервере 2012 R2. Я попытался с помощью диспетчера задач, но он генерирует ошибку, а также с помощью 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, но все они имеют одинаковую ошибку "Отказано в доступе" для рабочих процессов, использующих более 16 ГБ памяти.
Я также попытался добавить -r, чтобы отразить / клонировать процесс, как рекомендовано в разделе Практическое руководство. Быстро выполнить дамп памяти пула приложений ASP.NET, но все равно получаю то же сообщение об ошибке, что и выше.
Обновление: поэтому по умолчанию пулы приложений IIS будут перезагружены, если они не будут отвечать на текущие внутренние запросы ping в течение 90 секунд. Вы можете увидеть это в дополнительных настройках:
И сообщение об ошибке появляется примерно через 90 секунд, поэтому, вероятно, это является причиной проблемы.
1 ответ
Таким образом, происходит следующее: procdump приостанавливает рабочий процесс, который не позволяет ему реагировать на внутренние запросы, даже если используется опция -r отражать / клонировать. И если запись памяти в файл дампа занимает более 90 секунд, IIS перезапустит работника, что приведет к завершению старого процесса. Затем Procdump возвращает сообщение об ошибке "Отказано в доступе" или "Только часть запроса ReadProcessMemory или WriteProcessMemory была завершена", так как память, которую он пытался прочитать, больше не выделяется и процесс больше не существует.
Чтобы обойти эту проблему, вы можете использовать Resouce Monitor, Process Explorer или 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
после создания дампа памяти.