Процессор перегружен, загрузка ЦП процессом низкая, в Filemon нет активности

Процессор перегружен, загрузка ЦП процессом низкая, в Filemon нет активности

У меня есть 6-летний ноутбук со следующими характеристиками:

  • Операционная система: Windows 8.1 Pro 64-бит (6.3, сборка 9600)

  • Марка и модель: SAMSUNG 770Z5E/780Z5E

  • Процессор: Intel(R) Core(TM) i7-3635QM CPU @ 2.40 GHz

  • Оперативная память: 8 ГБ

В последнее время, похоже, появился процесс, который заставляет ноутбук нагреваться и заставлять вентиляторы работать как сумасшедшие. У меня этот процесс и программное обеспечение (утилита мыши Logitech) уже более 3 лет. Единственными системными изменениями были обновления Windows, которые я применяю раз в квартал. Ничего не устанавливалось больше года.

Процесс — LogiOptionsMgr.exe. Как только я его убиваю, ноутбук успокаивается в течение 30 секунд. Странно, что процесс утверждает, что использует < 1% ЦП, а Filemon не регистрирует никаких операций ввода-вывода (диск, реестр, сеть и т. д.).

Все, что я вижу, противоречит тому, что я знаю о компьютерах. Если загрузка процесса показывает < 1%, это не должно быть причиной такого поведения ноутбука. И в любом случае, процесс, похоже, ничего не делает, согласно Filemon. Опять же, убейте его, и ноутбук вернется в нормальное состояние.

Что может происходить?

решение1

Итак, после указаний от Mokubai выяснилось, что программное обеспечение AMD Switchable Graphics ошибочно определяло программное обеспечение Logitech как приложение, требующее включения моей 3D-видеокарты с высокими настройками производительности.

В моем ноутбуке встроенная графика Intel, а также AMD Radeon 9700 series. Я создал профили приложений в программном обеспечении AMD Catalyst, чтобы явно рассматривать все программное обеспечение Logitech как то, что пытается оптимизировать время работы батареи в ущерб производительности. Кажется, мне это удалось. Этот глюк появился после обновления Windows, так что не знаю, кого винить.

решение2

Даже после миграции LogiOptionsMgr.exeна iGPU он продолжит потреблять определенное количество ватт. Ниже я покажу, как уменьшить счет за электроэнергию, полностью устранив проблему.

Примечание:Тыне единственный с этим проблема(более 10 000 (примерно 34 557) человекв итоге):

Если я откроюПроцесс Хакери складываем столбцы «GPU» и «GPU dedicated bytes», то в моем случае LogiOptionsMgr.exeиспользуется 0,94% GPU (6,19% при перемещении любого окна) и 1,14 МБ.

Теперь попробуем локализовать проблему (поток, стек вызовов):

  1. в Process Hacker: дважды щелкните по LogiOptionsMgr.exeпроцессу > в окне «Свойства»: переключитесь на вкладку «Потоки»
  2. сортировать ▼ по столбцу ЦП
  3. попробуйте приостановить поток, который использует больше всего ресурсов ЦП: откройте контекстное меню потока > пункт «Приостановить»
  4. в главном окне Process Hacker: нагрузка на графический процессор должна исчезнуть
    на вкладке «Потоки»: строка потока стала серой
  5. Теперь вы можете посмотреть на стек вызовов (двойной щелчок по потоку) — в моем случае стек был таким:
    0, ntdll.dll!NtWaitForSingleObject+0xa
    1, KernelBase.dll!WaitForSingleObjectEx+0x9c
    2, d3d9.dll!Direct3DCreate9+0x194fe
    3, d3d9.dll!Direct3DCreate9Ex+0x17df
    4, d3d9.dll!Direct3DCreate9Ex+0x1794
    5, d3d9.dll!Direct3DShaderValidatorCreate9+0x1515b
    6, d3d9.dll!Direct3DShaderValidatorCreate9+0x98aa
    7, d3d9.dll!Direct3DShaderValidatorCreate9+0x167c0
    8, d3d9.dll!DebugSetLevel+0x1584e
    9, LogiOptionsMgr.exe+0xd4343
    10, LogiOptionsMgr.exe+0x94947
    11, LogiOptionsMgr.exe+0x1d6184
    12, LogiOptionsMgr.exe+0x1dbae3
    13, LogiOptionsMgr.exe+0x1dbc8a
    14, kernel32.dll!BaseThreadInitThunk+0xd
    15, ntdll.dll!RtlUserThreadStart+0x21
    
    Примечание:Пока не обращайте внимания на названия функций d3d9.dll— они неточные (правильные названия вы увидите ниже).

Далее попробуем найти проблемное место (#9 в стеке вызовов выше) в коде LogiOptionsMgr.exeи исправить его самостоятельно. Кстати, версия моего LogiOptionsMgr.exe3.20.35нет уязвимый.

Примечание:помните, что вы приостановили один поток LogiOptionsMgr.exe.

Вам понадобитсяx64dbgотладчик. Надеюсь, у вас есть опыт работы с ним, если нет, то вот несколько настроек, которые облегчат работу с ним (меню «Параметры» > «Настройки»):

  • Событиявкладка > «Break on» — снимите все эти отметки (в будущем можно попробовать включить «Entry Breakpoint*» и «Attach Breakpoint»)
  • Исключениявкладка: кнопка «Добавить диапазон» > начало: 00000000, конец:FFFFFFFF

Давай начнем:

  1. Меню Файл >Прикреплять: выбрать LogiOptionsMgr.exeи прикрепить
  2. загрузка символов для d3d9.dll(это делается только один раз):
    • на вкладке «Символы»: левая панель > модуль «d3d9.dll» > контекстное меню: «Загрузить символы для этого модуля»
  3. найдите это место в коде программы: LogiOptionsMgr.exe+0xd4343(#9 в стеке вызовов выше):
    1. переключитесь на ранее приостановленный поток — на вкладке «Потоки» (x64dbg):
      1. найдите его 1в столбце «Suspend Count» или по TID Process Hacker, dec → столбец «ID» x64dbg, hex
      2. дважды щелкните по нему
    2. вы на вершине стека — откатитесь немного назад:
      1. на вкладке «Стек вызовов»: контекстное меню: «Показать предполагаемый кадр стека вызовов"
      2. в колонке «Комментарии»: найдите «возврат к logioptionsmgr.… из d3d9.…»
      3. дважды щелкните по нему
    3. на вкладке ЦП: прокрутите вверхкак мнемного, чтобы увидеть предыдущие инструкции
      • инструкция testв данный момент выбрана (в моем случае — test eax,eax); над ней находится callинструкция (в моем случае — call qword ptr ds:[rax+3C8])
    4. установите точку останова на callинструкции — нажмите на серый маркер слева → он станет красным
    5. возобновить текущую (приостановленную) ветку — на вкладке «Ветки»: контекстное меню ветки: «Возобновить ветку»
    6. Теперь на вкладке ЦП вы можете увидеть настоящее имя вызываемой d3d9.dllфункции: qword [rax+3C8]=<d3d9.public: virtual long __cdecl CBaseDevice::PresentEx(…) __ptr64>
      т.е. стек вызовов, показанный выше, выглядит следующим образом:
      • 0,ntdll.dll!NtWaitForSingleObject+0xa
      • 1,KernelBase.dll!WaitForSingleObjectEx+0x9c
      • 2,d3d9.dll!CBaseDevice::AcquireWriteAccess
      • 3,d3d9.dll!CBaseDevice::UpdateRenderTarget
      • 4,d3d9.dll!CD3DBase::SetRenderTargetI
      • 5,d3d9.dll!CSwapChain::ResetRenderTargets
      • 6,d3d9.dll!CSwapChain::PresentMain
      • 7,d3d9.dll!CBaseDevice::PresentMain
      • 8, d3d9.dll!CBaseDevice::PresentExPresentExPresent- LogiOptionsMgr.exeхотетьподарокпокажите нам что-нибудь…
      • 9,LogiOptionsMgr.exe+0xd4343
  4. если вы пройдете эту часть программы вРежим «Перешагнуть»F8, вы можете понять, что эта нить закручивается в цикл, который начинается с movzx eax,byte ptr ds:[rsi+38](почти сразу послеcall qword ptr ds:[<&NtUserShowWindow>] ShowWindow) и возвращается к началу послеcall qword ptr ds:[<&PeekMessageW>]

В начале цикла находится условие входа/выхода цикла:

test al,al
jne logioptionsmgr.13F904520

Если вы заменитеjne с je:

  1. контекстное меню: Собратьspace
  2. заменитьjneje

… и возобновить выполнение F9программы, затем ресурсы, созданныеCoInitializeиDirect3DCreate9Ex(см. выше в asm) будет правильно завершен, поток завершится, а на вкладке «Журнал» появятся следующие записи (в случае GPU от NVIDIA):

DLL Unloaded: … nvd3dumx.dll
DLL Unloaded: … psapi.dll
Thread … exit

Примечание:разгрузкаpsapi.dllвозможно, намекнул, что персональные настройки мыши для приложений перестанут работать (переключение), однако персональные настройки по-прежнему работают.

Перед окончательной фиксацией патча осталось убедиться, что он работает правильно при LogiOptionsMgr.exeзапуске:

  1. предварительная подготовка:
    1. сохранить патч — во вкладке CPU: контекстное меню asm view: Patches Ctrl+ P: кнопка Export; в моем случае (для v3.20.35) я получил следующее содержимое файла патча LogiOptionsMgr.1337:
      >logioptionsmgr.exe
      00000000000D4317:85->84
      
    2. установить точку останова на call qword ptr ds:[<&NtUserShowWindow>](было упомянуто выше)
  2. подготовка:
    1. перезапустить LogiOptionsMgr.exe— меню «Отладка» > «Перезапустить» Ctrl+F2
    2. после перезапуска выполнение программы должно было остановиться на call qword ptr ds:[<&NtUserShowWindow>], и как вы видите, патч ( jneje) не был применен автоматически, поэтому примените его вручную — Ctrl+ P: Кнопка импорта
  3. проверятьпуть выполнения кода (цикл должен быть пропущен) — «Перешагнуть» F8(или"Анимация окончена", или используйтетрассировка)
  4. возобновить выполнение программы — «Выполнить» F9; путь выполнения кода необходимо повторить еще раз:
    • ресурсы будут освобождены
    • поток будет завершен (выход)
    • соответствующие записи появятся на вкладке Журнал

Чтобы применить патч, откройте диалоговое окно «Патчи» Ctrl+ Pснова: кнопку «Файл патча» (временно сохраните исправленный файл LogiOptionsMgr.exeв другом месте, а затем замените исходный).

Не забудьте отключить отладчик (меню Файл >Отсоединить) или немедленно завершить LogiOptionsMgr.exeпроцесс (меню «Отладка» >Закрыть Alt+F2) перед заменой LogiOptionsMgr.exeфайла.

Примечание:В ходе выполнения вышеуказанных действий minidump\dump-*_*.dmpв каталоге могут появиться минидампы LogiOptionsMgr.exe— их можно смело удалять.

Примечание:в общем случае после замены LogiOptionsMgr.exeлучше перезапустить его родителя ( LogiOptions.exe) с помощью logoff Ctrl+ Alt+ Delete, Alt+ L/ login.

Связанный контент