Как автоматически создавать дамп приложения при остановке лог-файла в Windows Server 2019
В процессе работы приложений иногда возникает ситуация, когда программа «зависает» — не завершается, не падает с ошибкой, но и не выполняет свои функции. В такой ситуации полезно анализировать состояние процесса, чтобы понять причину остановки. Один из способов — создание дампа памяти (memory dump) в момент, когда приложение перестает обновлять свой лог-файл.
В этой статье мы подробно рассмотрим, как организовать автоматический мониторинг файла логов приложения и создавать дамп памяти при выявлении его «остановки». Решение будет работать на Windows Server 2019 и основано на PowerShell-скрипте с использованием утилиты procdump.
Проблема: приложение перестает писать в лог, но продолжает висеть
Когда приложение «зависает», его процесс не исчезает из диспетчера задач, нет сбоев в работе ОС, но в лог-файле не появляется новая информация. Чтобы диагностировать проблему, полезно автоматически зафиксировать состояние процесса именно в момент его неактивности.
- Лог-файл приложения — простой текстовый файл, не связанный с журналами Windows (Event Viewer).
- Необходимо отследить, что файл не меняется в течение определенного времени (например, 30 секунд).
- При таком событии автоматизировать создание дампа памяти приложения для дальнейшего анализа.
Рекомендуемый подход для автоматического создания дампа
Основная идея:
- Мониторить последний момент изменения лог-файла.
- Если файл не изменялся более установленного времени (30 секунд), считать приложение неактивным.
- Найти процесс приложения по имени и вызвать команду создания дампа через утилиту procdump.
- Сохранить дамп в указанной папке для последующего анализа.
Использование PowerShell для мониторинга лог-файла
PowerShell позволяет организовать легковесный бесконечный цикл, который опрашивает дату последнего изменения файла, и при необходимости вызывает нужные действия.
Основные моменты:
- Утилита
Get-Item
извлекает информацию о файле, а метод.Refresh()
обновляет атрибуты. - Вместо затратного обращения к дате и времени Windows в формате UTC, можно использовать
[DateTime]::Now
для простоты. - Запуск внешних программ в PowerShell удобен командой
Start-Process
или с помощью амперсанда&
. - В пути и параметрах, содержащих пробелы, следует использовать кавычки.
Пример скрипта PowerShell для решения задачи
powershell
Общие параметры
$filePath = "C:\Path\To\Logs\application.log" # Путь к лог-файлу
$stableTime = 30 # Время (сек), в течение которого файл не должен изменяться
$processName = "MyApplication" # Имя процесса приложения (без .exe)
$dumpDir = "E:\Dumps" # Папка для сохранения дампов
Проверка и создание директории для дампов
if (-not (Test-Path $dumpDir)) {
New-Item -Path $dumpDir -ItemType Directory | Out-Null
}
Write-Host "Мониторинг файла: $filePath"
Функция для получения времени последнего изменения файла в UTC
function Get-LastWriteTimeUtc($path) {
return (Get-Item $path).LastWriteTimeUtc
}
Инициализация времени последнего изменения
$lastModTime = Get-LastWriteTimeUtc $filePath
Цикл мониторинга файла
while ($true) {
Start-Sleep -Seconds 5
$currentModTime = Get-LastWriteTimeUtc $filePath
if ($currentModTime -eq $lastModTime) {
$age = (Get-Date).ToUniversalTime() - $currentModTime
if ($age.TotalSeconds -ge $stableTime) {
Write-Host "Файл не изменялся в течение $stableTime секунд."
break
}
} else {
$lastModTime = $currentModTime
}
}
Поиск процесса и создание дампа
try {
$proc = Get-Process -Name $processName -ErrorAction Stop
$pid = $proc.Id
Write-Host "Найден процесс ‘$processName’ с PID $pid"
$dumpCommand = "procdump -ma $pid `"$dumpDir`""
Write-Host "Запуск команды: $dumpCommand"
Start-Process -FilePath "procdump.exe" -ArgumentList "-ma $pid `"$dumpDir`""
Write-Host "Создание дампа памяти запущено. Проверьте папку $dumpDir."
} catch {
Write-Host "Ошибка: процесс ‘$processName’ не найден. Проверьте, запущено ли приложение."
}
Как использовать данный скрипт
- Настройка путей: замените
$filePath
на путь к вашему лог-файлу,$processName
на имя процесса вашего приложения, а$dumpDir
на желаемую папку для дампов. - Установка procdump: скачайте и установите утилиту procdump от Microsoft Sysinternals, она нужна для создания дампов.
- Запуск: выполняйте скрипт на Windows Server 2019 под учетной записью с правами доступа к процессу и файлам.
- Настройка автозапуска: при необходимости можно настроить запуск скрипта как задачу в Планировщике Windows.
Преимущества автоматизации: быстрое реагирование и детальный анализ
- Автоматический мониторинг позволяет сразу реагировать, не ожидая вручную.
- Дамп памяти помогает выявлять причины «подвисания» машины — например, блокировки потоков, дедлоки, избыточное потребление ресурсов.
- Этот подход легко адаптируется под различные приложения и конфигурации.
Заключение
Автоматическое создание дампов при остановке логов — мощный инструмент диагностики проблем в работе приложений. С помощью простого PowerShell-скрипта и утилиты procdump можно реализовать эффективный мониторинг и при необходимости мгновенно фиксировать состояние процесса.
Если вы работаете с Windows Server 2019 и сталкиваетесь с подобными «зависаниями», описанный подход значительно упростит поиск и устранение причин неполадок.
Ключевые слова: мониторинг лог-файла, зависание приложения, создание дампа, procdump, PowerShell, Windows Server 2019, автоматизация диагностики, memory dump, диагностика приложений, остановка программы.