Ждите 30 секунд без изменений файла, затем сделайте дамп приложения: руководство

Как автоматически создавать дамп приложения при остановке лог-файла в Windows Server 2019

В процессе работы приложений иногда возникает ситуация, когда программа «зависает» — не завершается, не падает с ошибкой, но и не выполняет свои функции. В такой ситуации полезно анализировать состояние процесса, чтобы понять причину остановки. Один из способов — создание дампа памяти (memory dump) в момент, когда приложение перестает обновлять свой лог-файл.

В этой статье мы подробно рассмотрим, как организовать автоматический мониторинг файла логов приложения и создавать дамп памяти при выявлении его «остановки». Решение будет работать на Windows Server 2019 и основано на PowerShell-скрипте с использованием утилиты procdump.


Проблема: приложение перестает писать в лог, но продолжает висеть

Когда приложение «зависает», его процесс не исчезает из диспетчера задач, нет сбоев в работе ОС, но в лог-файле не появляется новая информация. Чтобы диагностировать проблему, полезно автоматически зафиксировать состояние процесса именно в момент его неактивности.

  • Лог-файл приложения — простой текстовый файл, не связанный с журналами Windows (Event Viewer).
  • Необходимо отследить, что файл не меняется в течение определенного времени (например, 30 секунд).
  • При таком событии автоматизировать создание дампа памяти приложения для дальнейшего анализа.

Рекомендуемый подход для автоматического создания дампа

Основная идея:

  1. Мониторить последний момент изменения лог-файла.
  2. Если файл не изменялся более установленного времени (30 секунд), считать приложение неактивным.
  3. Найти процесс приложения по имени и вызвать команду создания дампа через утилиту procdump.
  4. Сохранить дамп в указанной папке для последующего анализа.

Использование 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’ не найден. Проверьте, запущено ли приложение."
}


Как использовать данный скрипт

  1. Настройка путей: замените $filePath на путь к вашему лог-файлу, $processName на имя процесса вашего приложения, а $dumpDir на желаемую папку для дампов.
  2. Установка procdump: скачайте и установите утилиту procdump от Microsoft Sysinternals, она нужна для создания дампов.
  3. Запуск: выполняйте скрипт на Windows Server 2019 под учетной записью с правами доступа к процессу и файлам.
  4. Настройка автозапуска: при необходимости можно настроить запуск скрипта как задачу в Планировщике Windows.

Преимущества автоматизации: быстрое реагирование и детальный анализ

  • Автоматический мониторинг позволяет сразу реагировать, не ожидая вручную.
  • Дамп памяти помогает выявлять причины «подвисания» машины — например, блокировки потоков, дедлоки, избыточное потребление ресурсов.
  • Этот подход легко адаптируется под различные приложения и конфигурации.

Заключение

Автоматическое создание дампов при остановке логов — мощный инструмент диагностики проблем в работе приложений. С помощью простого PowerShell-скрипта и утилиты procdump можно реализовать эффективный мониторинг и при необходимости мгновенно фиксировать состояние процесса.

Если вы работаете с Windows Server 2019 и сталкиваетесь с подобными «зависаниями», описанный подход значительно упростит поиск и устранение причин неполадок.


Ключевые слова: мониторинг лог-файла, зависание приложения, создание дампа, procdump, PowerShell, Windows Server 2019, автоматизация диагностики, memory dump, диагностика приложений, остановка программы.

Источник

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *