处理器紧张,进程 CPU 使用率低,Filemon 中无活动

处理器紧张,进程 CPU 使用率低,Filemon 中无活动

我有一台 6 年前的笔记本电脑,其规格如下:

  • 操作系统:Windows 8.1 Pro 64 位(6.3,Build 9600)

  • 品牌和型号:SAMSUNG 770Z5E/780Z5E

  • 处理器:Intel(R) Core(TM) i7-3635QM CPU @ 2.40 GHz

  • 内存:8 GB

最近似乎有一个进程导致笔记本电脑变热,风扇疯狂旋转。我已经使用这个进程和软件(Logitech 鼠标实用程序)超过 3 年了。唯一的系统变化是 Windows 更新,我每季度应用一次。一年多来什么都没安装。

该进程是 LogiOptionsMgr.exe。我一关闭它,笔记本电脑就会在 30 秒内稳定下来。奇怪的是,该进程仅声称使用了 < 1% 的 CPU,并且 Filemon 没有记录任何 IO(磁盘、注册表、网络等)。

我看到的一切都与我对计算机的了解相悖。如果进程利用率显示 < 1%,那不应该是笔记本电脑出现这种情况的原因。而且无论如何,根据 Filemon 的说法,该进程似乎没有做任何事情。再次将其终止,笔记本电脑就会恢复正常。

可能发生了什么事?

答案1

因此,在 Mokubai 的指导下,事实证明 AMD 的可切换显卡软件错误地将 Logitech 软件检测为要求我的 3D 显卡以高性能设置启动的应用程序。

我的笔记本电脑内置了英特尔显卡和 AMD Radeon 9700 系列。我在 AMD Catalyst 软件中创建了应用程序配置文件,将所有 Logitech 软件明确视为试图优化电池寿命而不是性能的软件。似乎已经做到了。这个故障是在 Windows 更新后出现的,所以真的不知道该怪谁。

答案2

即使迁移LogiOptionsMgr.exe到 iGPU 后,它仍会继续消耗一定量的瓦特。下面我将展示如何通过彻底消除该问题来减少电费。

笔记:你是并非唯一一个 问题超过 10,000人(约 34,557人)总共):

如果我打开进程黑客并添加“GPU”和“GPU 专用字节”列,那么在我的情况下,LogiOptionsMgr.exeGPU 的利用率为 0.94%(移动任何窗口时为 6.19%)和 1.14 MB。

现在让我们尝试定位问题(线程、调用堆栈):

  1. 在 Process Hacker 中:双击LogiOptionsMgr.exe进程 > 在属性窗口中:切换到线程选项卡
  2. 按 CPU 列排序 ▼
  3. 尝试暂停占用最多 CPU 的线程:打开线程的上下文菜单 > “暂停”项
  4. 在 Process Hacker 的主窗口中:GPU 上的负载应该
    在“线程”选项卡中消失:线程行已变为灰色
  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.exe是3.20.35不是 易受伤害的

笔记:记住,您已暂停了一个线程LogiOptionsMgr.exe

你需要64dbg调试器。我希望您有使用它的经验,如果没有,那么这里有一些设置可以让您更轻松地使用它(选项菜单 > 首选项):

  • 活动tab > “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通过“暂停计数”列或 TID Process Hacker、十进制→ “ID”列x64dbg、十六进制找到它
      2. 双击它
    2. 您位于堆栈顶部 — — 向后回滚一点:
      1. 在“调用堆栈”选项卡中:上下文菜单:“显示可疑的调用堆栈框架
      2. 在注释栏中:找到“从 d3d9 返回 logioptionsmgr.…”。
      3. 双击它
    3. 在 CPU 选项卡中:向上滚动汇编稍微看一下前面的说明
      • test当前选定的指令(在我的情况下是—— )test eax,eax;其上方是call指令(在我的情况下是—— call qword ptr ds:[rax+3C8]
    4. 在指令上设置断点call— 单击左侧的 • 灰色项目符号 → 它将变为红色
    5. 恢复当前(暂停)线程 — 在“线程”选项卡中:线程的上下文菜单:“恢复线程”
    6. 现在在 CPU 选项卡上您可以看到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. jne用。。。来代替je

…并恢复F9程序的执行,然后由CoInitializeDirect3DCreate9Ex(参见上面的 asm)将被正确释放,线程将退出,并且 Log 选项卡上将出现以下记录(对于来自 NVIDIA 的 GPU):

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

笔记:卸载psapi.dll可能已经暗示应用程序的个人鼠标设置将停止工作(切换),但是,个人设置仍然有效。

在最终提交补丁之前,还需要确保它在LogiOptionsMgr.exe启动时能够正常工作:

  1. 前期准备:
    1. 保存补丁 — 在“CPU”选项卡中:asm 视图的上下文菜单:补丁Ctrl+ P:导出按钮;就我而言(针对 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. 查看代码执行路径(必须跳过循环)—“Step over” F8(或“动画结束”或使用追踪
  4. 恢复程序执行 — “运行” F9;必须再次重复代码执行路径:
    • 资源将被释放
    • 线程将终止(退出)
    • 相应记录将出现在日志选项卡上

要提交补丁,请再次打开“补丁”对话框Ctrl+ P:“补丁文件”按钮(将修补程序临时保存LogiOptionsMgr.exe到另一个位置,然后替换原始位置)。

不要忘记分离调试器(文件菜单 >分离)或立即终止LogiOptionsMgr.exe进程(调试菜单 >关闭Alt+F2) 替换文件之前LogiOptionsMgr.exe

笔记:在上述过程中,小型转储minidump\dump-*_*.dmp可能会出现在目录中LogiOptionsMgr.exe——可以安全地删除它们。

笔记:一般情况下,替换后LogiOptionsMgr.exe最好通过logoff++ , + / login来重新启动其父级( LogiOptions.exe) 。CtrlAltDeleteAltL

相关内容