我有一台使用了 6 年的筆記型電腦,規格如下:
作業系統:Windows 8.1 Pro 64位元(6.3,Build 9600)
品牌與型號:三星 770Z5E/780Z5E
處理器:Intel(R) Core(TM) i7-3635QM CPU @ 2.40 GHz
記憶體:8GB
最近似乎有一個過程導致筆記型電腦變熱並使風扇瘋狂地呼嘯。我已經使用這個過程和軟體(羅技滑鼠實用程式)超過 3 年了。唯一的系統變更是 Windows 更新,我每季套用一次。已經一年多沒有安裝任何東西了。
該進程是LogiOptionsMgr.exe。我一殺掉它,筆記型電腦就會在 30 秒內穩定下來。奇怪的是,該進程僅聲稱使用 < 1% CPU,而 Filemon 沒有註冊 IO(磁碟、註冊表、網路等)。
我所看到的一切都與我對計算機的了解相違背。如果進程利用率顯示 < 1%,則不應成為筆記型電腦出現此類行為的原因。無論如何,根據 Filemon 的說法,該進程似乎沒有做任何事情。再次殺掉它,筆記型電腦就恢復正常了。
可能發生了什麼事?
答案1
因此,在 Mokubai 的指導下,事實證明 AMD 的可切換顯示卡軟體將 Logitech 軟體誤認為是一個需要我的 3D 顯示卡以高效能設定啟動的應用程式。
我的筆記型電腦內建了 Intel 顯示卡和 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% ?- 羅技支援:Logitech Options 高 GPU 負載 NVIDIA GeForce RTX 20?0 超級的 8%
- 羅技支援:
LogiOptionsMgr.exe (UNICODE)
GPU 使用情況 NVIDIA GeForce GTX 1070(150 瓦)的 2‑3%
- 使用 GPU 能力的羅技滑鼠軟體 NVIDIA GeForce 970 GTX(145 瓦)的 5-10%
Logioptions.exe
有人在運行時遇到 cpu 使用率高的問題嗎?- Logitech OPTIONS 軟體正在耗盡您的 GPU! NVIDIA GeForce GTX 1070(150 瓦); T
LogiOptionsMgr.exe
(閒置、負載):53-55°C、82-85°C;不含:40°C、70°C。 NVIDIA Titan Xp 的 21%(250 瓦)。 - 羅技軟體 *警告* T
LCore.exe
(閒置):50°C;不含:30°C。
如果我打開行程駭客並添加列“GPU”和“GPU 專用位元組”,然後在我的例子中,LogiOptionsMgr.exe
使用 0.94% 的 GPU(移動任何視窗時為 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
。
您將需要x64dbg偵錯工具.我希望您有使用它的經驗,如果沒有,那麼這裡有一些設定可以讓您更輕鬆地使用它(“選項”選單>“首選項”):
- 活動tab > “Break on” — 取消選擇所有這些(將來,您可以嘗試啟用“Entry Breakpoint*”和“Attach Breakpoint”)
- 例外情況選項卡:「新增範圍」按鈕 > 開始:
00000000
,結束:FFFFFFFF
讓我們開始:
- 檔案選單 >附:選擇
LogiOptionsMgr.exe
並附加 - 載入符號
d3d9.dll
(僅執行一次):- 在“符號”標籤中:左面板 >“d3d9.dll”模組 > 上下文選單:“下載此模組的符號”
- 在程式碼中找到這個地方:(
LogiOptionsMgr.exe+0xd4343
上面呼叫堆疊中的#9):- 切換到您之前掛起的線程 - 在「線程」標籤 (x64dbg) 中:
1
透過在「Suspend Count」欄位或透過 TID Process Hacker找到它,十進位→「ID」列x64dbg,十六進位- 雙擊它
- 你位於堆疊的頂部 - 回滾一點:
- 在“呼叫堆疊”標籤中:上下文選單:“顯示可疑的呼叫堆疊幀」
- 在註解欄中:找到“return to logioptionsmgr.... from d3d9....”
- 雙擊它
- 在 CPU 標籤中:向上捲動彙編稍微看一下前面的說明
test
目前已選擇該指令(在我的例子中 -test eax,eax
);上面是call
說明(在我的例子中 -call qword ptr ds:[rax+3C8]
)
- 在指令上設定斷點
call
— 點選左側的灰色項目符號 → 它將變成紅色 - 恢復目前(掛起的)執行緒 — 在“執行緒”標籤中:執行緒的上下文選單:“恢復執行緒”
d3d9.dll
現在,在 CPU 標籤上,您可以看到正在呼叫的函數的真實名稱: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
,最好LogiOptions.exe
透過 logoff Ctrl+ Alt+ Delete, Alt+ L/ login 重新啟動其父級 ( ) 。