Revit и цикл ошибки SQLDumpFile

При запуске Revit 2022 на экране появляется окно Windows Terminal с одной строкой:

WerReportAddfile SQLDumpFile failed, error: 0x8007007B

Окно закрывается само и через пару секунд открывается снова. Так продолжается, пока работает Revit. Заголовок вкладки указывает на C:\Program Files\Microsoft SQL Server\..., хотя SQL Server на компьютере никто не устанавливал. Сам Revit при этом запускается и работает, но система постоянно перезапускает процессы и нагружается.

Где искать причину

Сначала я предположил, что виноват sqlwriter.exe, остаток старой установки SQL Server 2005. Это оказалось ошибкой: он работал стабильно. PostgreSQL 16, установленный на машине, тоже был ни при чём.

Окно живёт всего пару секунд, поэтому процессы удалось поймать только фоновым скриптом, который логирует новые процессы с меткой времени и родителем:

powershell

$seen=@{}
while($true){
  Get-CimInstance Win32_Process | Where-Object {
    $_.ExecutablePath -match 'SQL Server|SQLDumper|WindowsTerminal|OpenConsole|conhost' -or $_.CommandLine -match 'sql'
  } | ForEach-Object {
    if(-not $seen[$_.ProcessId]){
      $seen[$_.ProcessId]=1
      $p = (Get-CimInstance Win32_Process -Filter "ProcessId=$($_.ParentProcessId)").Name
      "{0} PID={1} Родитель={2}({3}) {4} | {5}" -f (Get-Date -f HH:mm:ss.fff),$_.ProcessId,$p,$_.ParentProcessId,$_.ExecutablePath,$_.CommandLine
    }
  }
  Start-Sleep -Milliseconds 150
}

Скрипт запускается от администратора, затем стартует Revit. В логе проявилась такая цепочка:

Revit → RevitWorker.exe → sqlservr.exe (LocalDB 2014, инстанс SteelConnections2022)
      → падение через ~0,5 с → SQLDUMPER.EXE → Windows Terminal

RevitWorker каждые 2-3 секунды заново запускал встроенный LocalDB-инстанс SteelConnections2022. Тот сразу падал, SQLDUMPER пытался записать дамп (отсюда ошибка 0x8007007B), и открывалось окно терминала.

Настоящая причина

Причина видна в журнале самого инстанса. Он лежит здесь:

%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances\SteelConnections2022\error.log

Перед падением там есть два ключевых сообщения:

There have been 256 misaligned log IOs which required falling back to synchronous IO.
Exception c00000fd EXCEPTION_STACK_OVERFLOW

Это известная проблема старых версий SQL Server (LocalDB 2014, версия 12.0.6024) на современных NVMe-дисках. Движок не умеет работать с физическим сектором больше 4 КБ. Проверим, что сообщает диск:

powershell

fsutil fsinfo sectorinfo C:

В моём случае (WD PC SN5000S) результат такой:

LogicalBytesPerSector :                 512
PhysicalBytesPerSectorForAtomicity :    4096
PhysicalBytesPerSectorForPerformance :  65536

Физический сектор для производительности равен 65536 байт, и SQL Server 2014 на этом падает. Пересоздание инстанса не помогает: новый падает так же, потому что виноваты диск и движок, а не повреждённые файлы.

Решение

Нужно заставить драйвер NVMe сообщать сектор 4 КБ. PowerShell запускается от администратора:

powershell

# Бэкап ветки реестра
reg export "HKLM\SYSTEM\CurrentControlSet\Services\stornvme" "$env:USERPROFILE\Desktop\stornvme-backup.reg" /y

# Принудительный размер сектора
$k = "HKLM:\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device"
New-Item -Path $k -Force | Out-Null
New-ItemProperty -Path $k -Name ForcedPhysicalSectorSizeInBytes -PropertyType MultiString -Value "* 4095" -Force

После этого:

  1. Перезагрузите компьютер: драйвер читает значение только при загрузке.
  2. Проверьте, что PhysicalBytesPerSectorForPerformance теперь равен 4096.
  3. Удалите старый инстанс, чтобы он пересоздался с правильными параметрами:

powershell

Get-Process Revit,RevitWorker,sqlservr,SQLDUMPER -ErrorAction SilentlyContinue | Stop-Process -Force
$dir = "$env:LOCALAPPDATA\Microsoft\Microsoft SQL Server Local DB\Instances\SteelConnections2022"
sqllocaldb stop SteelConnections2022 -k
sqllocaldb delete SteelConnections2022
if (Test-Path $dir) { Rename-Item $dir "$dir.bak2" }
  1. Запустите Revit. Инстанс создастся заново и стартует без падений, окно терминала больше не появляется.

Если параметр окажется вредным, откат делается так, затем нужна перезагрузка:

powershell

Remove-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device" -Name ForcedPhysicalSectorSizeInBytes

Параметр меняет только размер сектора, который драйвер сообщает системе. Данные на диске он не затрагивает, но это системная настройка, поэтому сначала убедитесь по fsutil, что у вас действительно большой сектор.

Если не хочется трогать драйвер

Можно убрать источник проблемы: удалить или отключить компонент, который создаёт инстанс SteelConnections2022. Если Steel Connections вам не нужен, этого достаточно. Обратите внимание, что в стандартных папках Addins\2022 его манифеста не оказалось, так что искать его нужно среди установленных программ Autodesk.

Итоги

  • Окно с SQLDumpFile failed порождает не Revit, а упавший LocalDB, который запускает RevitWorker.
  • Ошибка 0x8007007B вторична, это лишь сбой записи дампа.
  • Настоящая причина: SQL Server 2014 не работает с NVMe-диском, у которого физический сектор больше 4 КБ.
  • Решение: параметр ForcedPhysicalSectorSizeInBytes = * 4095 для драйвера stornvme, перезагрузка и пересоздание инстанса LocalDB.
  • Диагностика без гаданий: логирование процессов с родителями и чтение error.log инстанса.