我有一台 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 NVIDIA GeForce RTX 3060 Ti(200 瓦)
logioptionsmgr.exe
在空闲时会占用高达 30% 的电量?- 罗技支持:罗技选项高 GPU 负载 NVIDIA GeForce RTX 20?0 Super 的 8%
- Logitech 支持:
LogiOptionsMgr.exe (UNICODE)
Gpu 使用情况 NVIDIA GeForce GTX 1070(150 瓦)的 2‑3%
- 使用 GPU 功率的 Logitech 鼠标软件 NVIDIA GeForce 970 GTX(145 瓦)的 5‑10%
Logioptions.exe
有人在运行时遇到 CPU 使用率高的问题吗?- 罗技 OPTIONS 软件正在吞噬你的 GPU!!!! NVIDIA GeForce GTX 1070(150 瓦);T
LogiOptionsMgr.exe
(空闲,负载):53-55°C,82-85°C;空载:40°C,70°C。 NVIDIA Titan Xp(250 瓦)的 21%。 - 罗技软件 *警告* 空转时温度
LCore.exe
:50°C;空转时温度:30°C。
如果我打开进程黑客并添加“GPU”和“GPU 专用字节”列,那么在我的情况下,LogiOptionsMgr.exe
GPU 的利用率为 0.94%(移动任何窗口时为 6.19%)和 1.14 MB。
现在让我们尝试定位问题(线程、调用堆栈):
- 在 Process Hacker 中:双击
LogiOptionsMgr.exe
进程 > 在属性窗口中:切换到线程选项卡 - 按 CPU 列排序 ▼
- 尝试暂停占用最多 CPU 的线程:打开线程的上下文菜单 > “暂停”项
- 在 Process Hacker 的主窗口中:GPU 上的负载应该
在“线程”选项卡中消失:线程行已变为灰色 - 现在您可以查看调用堆栈(双击线程) - 就我而言,堆栈是这样的:
笔记: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
让我们开始:
- 文件菜单 >附:选择
LogiOptionsMgr.exe
并附加 - 加载符号
d3d9.dll
(仅执行一次):- 在“符号”选项卡中:左侧面板 > “d3d9.dll”模块 > 上下文菜单:“下载此模块的符号”
- 在程序代码中找到这个位置:(
LogiOptionsMgr.exe+0xd4343
上面调用堆栈中的#9):- 切换到之前暂停的线程 — 在“线程”选项卡中(x64dbg):
1
通过“暂停计数”列或 TID Process Hacker、十进制→ “ID”列x64dbg、十六进制找到它- 双击它
- 您位于堆栈顶部 — — 向后回滚一点:
- 在“调用堆栈”选项卡中:上下文菜单:“显示可疑的调用堆栈框架“
- 在注释栏中:找到“从 d3d9 返回 logioptionsmgr.…”。
- 双击它
- 在 CPU 选项卡中:向上滚动汇编稍微看一下前面的说明
test
当前选定的指令(在我的情况下是—— )test eax,eax
;其上方是call
指令(在我的情况下是——call qword ptr ds:[rax+3C8]
)
- 在指令上设置断点
call
— 单击左侧的 • 灰色项目符号 → 它将变为红色 - 恢复当前(暂停)线程 — 在“线程”选项卡中:线程的上下文菜单:“恢复线程”
- 现在在 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::PresentEx
←PresentEx
←Present
-LogiOptionsMgr.exe
想要展示给我们展示一些东西... - 9,
LogiOptionsMgr.exe+0xd4343
- …
- 0,
- 切换到之前暂停的线程 — 在“线程”选项卡中(x64dbg):
- 如果你在“跨步”模式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
- 上下文菜单:组装space
jne
用。。。来代替je
…并恢复F9程序的执行,然后由CoInitialize
和Direct3DCreate9Ex
(参见上面的 asm)将被正确释放,线程将退出,并且 Log 选项卡上将出现以下记录(对于来自 NVIDIA 的 GPU):
DLL Unloaded: … nvd3dumx.dll
DLL Unloaded: … psapi.dll
Thread … exit
笔记:卸载psapi.dll
可能已经暗示应用程序的个人鼠标设置将停止工作(切换),但是,个人设置仍然有效。
在最终提交补丁之前,还需要确保它在LogiOptionsMgr.exe
启动时能够正常工作:
- 前期准备:
- 保存补丁 — 在“CPU”选项卡中:asm 视图的上下文菜单:补丁Ctrl+ P:导出按钮;就我而言(针对 v3.20.35),我得到了补丁文件的以下内容
LogiOptionsMgr.1337
:>logioptionsmgr.exe 00000000000D4317:85->84
- 设置断点
call qword ptr ds:[<&NtUserShowWindow>]
(上面提到过)
- 保存补丁 — 在“CPU”选项卡中:asm 视图的上下文菜单:补丁Ctrl+ P:导出按钮;就我而言(针对 v3.20.35),我得到了补丁文件的以下内容
- 准备:
- 重新启动
LogiOptionsMgr.exe
— 调试菜单 > 重新启动Ctrl+F2 - 重启后,程序执行应该在 处停止
call qword ptr ds:[<&NtUserShowWindow>]
,如你所见,补丁(jne
→je
)未自动应用,因此请手动应用 — Ctrl+ P:导入按钮
- 重新启动
- 查看代码执行路径(必须跳过循环)—“Step over” F8(或“动画结束”或使用追踪)
- 恢复程序执行 — “运行” F9;必须再次重复代码执行路径:
- 资源将被释放
- 线程将终止(退出)
- 相应记录将出现在日志选项卡上
要提交补丁,请再次打开“补丁”对话框Ctrl+ P:“补丁文件”按钮(将修补程序临时保存LogiOptionsMgr.exe
到另一个位置,然后替换原始位置)。
不要忘记分离调试器(文件菜单 >分离)或立即终止LogiOptionsMgr.exe
进程(调试菜单 >关闭Alt+F2) 替换文件之前LogiOptionsMgr.exe
。
笔记:在上述过程中,小型转储minidump\dump-*_*.dmp
可能会出现在目录中LogiOptionsMgr.exe
——可以安全地删除它们。
笔记:一般情况下,替换后LogiOptionsMgr.exe
最好通过logoff++ , + / login来重新启动其父级( LogiOptions.exe
) 。CtrlAltDeleteAltL