處理器緊張,進程 CPU 使用率低,Filemon 中沒有活動

處理器緊張,進程 CPU 使用率低,Filemon 中沒有活動

我有一台使用了 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”和“GPU 專用位元組”,然後在我的例子中,LogiOptionsMgr.exe使用 0.94% 的 GPU(移動任何視窗時為 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

您將需要x64dbg偵錯工具.我希望您有使用它的經驗,如果沒有,那麼這裡有一些設定可以讓您更輕鬆地使用它(“選項”選單>“首選項”):

  • 活動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透過在「Suspend Count」欄位或透過 TID Process Hacker找到它,十進位→「ID」列x64dbg,十六進位
      2. 雙擊它
    2. 你位於堆疊的頂部 - 回滾一點:
      1. 在“呼叫堆疊”標籤中:上下文選單:“顯示可疑的呼叫堆疊幀
      2. 在註解欄中:找到“return to logioptionsmgr.... from d3d9....”
      3. 雙擊它
    3. 在 CPU 標籤中:向上捲動彙編稍微看一下前面的說明
      • test目前已選擇該指令(在我的例子中 - test eax,eax);上面是call說明(在我的例子中 - call qword ptr ds:[rax+3C8]
    4. 在指令上設定斷點call— 點選左側的灰色項目符號 → 它將變成紅色
    5. 恢復目前(掛起的)執行緒 — 在“執行緒”標籤中:執行緒的上下文選單:“恢復執行緒”
    6. 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::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程式的執行,然後恢復由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,最好LogiOptions.exe透過 logoff Ctrl+ Alt+ Delete, Alt+ L/ login 重新啟動其父級 ( ) 。

相關內容