プロセッサに負担がかかり、プロセスの CPU 使用率が低く、Filemon でアクティビティがない

プロセッサに負担がかかり、プロセスの CPU 使用率が低く、Filemon でアクティビティがない

私は次の仕様の 6 年前のラップトップを持っています:

  • オペレーティング システム: Windows 8.1 Pro 64 ビット (6.3、ビルド 9600)

  • メーカーとモデル: SAMSUNG 770Z5E/780Z5E

  • プロセッサ: Intel(R) Core(TM) i7-3635QM CPU @ 2.40 GHz

  • メモリ: 8GB

最近、ラップトップが熱くなり、ファンが狂ったように回転する原因となっているプロセスがあるようです。このプロセスとソフトウェア (Logitech マウス ユーティリティ) は 3 年以上使用しています。システムの変更は、四半期に 1 回適用する Windows アップデートのみです。1 年以上何もインストールされていません。

プロセスは LogiOptionsMgr.exe です。これを強制終了すると、ラップトップは 30 秒以内に安定します。奇妙なのは、プロセスが CPU 使用率 1% 未満しか表示せず、Filemon が IO (ディスク、レジストリ、ネットワークなど) をまったく記録していないことです。

私が見ているものはすべて、コンピューターに関する私の知識に反しています。プロセスの使用率が 1% 未満を示している場合、それがラップトップがこのように動作する原因ではないはずです。いずれにせよ、Filemon によると、プロセスは何もしていないようです。もう一度、それを強制終了すると、ラップトップは正常に戻ります。

何が起こっているのでしょうか?

答え1

Mokubai からの指示に従って、AMD の Switchable Graphics ソフトウェアが Logitech ソフトウェアを、3D グラフィック カードに高パフォーマンス設定で起動することを要求するアプリケーションとして誤検出していたことが判明しました。

私のラップトップには、Intel グラフィックスと AMD Radeon 9700 シリーズが組み込まれています。AMD Catalyst ソフトウェア内でアプリケーション プロファイルを作成し、すべての Logitech ソフトウェアをパフォーマンスよりもバッテリー寿命を最適化するものとして明示的に扱いました。うまくいったようです。この不具合は Windows の更新後に発生したため、誰のせいなのか本当にわかりません。

答え2

iGPU に移行した後でもLogiOptionsMgr.exe、一定量のワット数を消費し続けます。以下では、この問題を完全に排除して電気代を削減する方法を紹介します。

注記:あなたはこれを持っているのは私だけではない 問題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.exe3.20.35です。ない 脆弱

注記:の 1 つのスレッドを一時停止したことを覚えておいてくださいLogiOptionsMgr.exe

必要なのは64dbg のデバッガー。すでに使用経験があると思いますが、そうでない場合は、デバッガーの操作を簡単にする設定がいくつかあります ([オプション] メニュー > [設定])。

  • イベントタブ > 「ブレークオン」 — これらすべての選択を解除します (将来的には、「エントリブレークポイント*」と「ブレークポイントのアタッチ」を有効にしてみてください)
  • 例外タブ:「範囲を追加」ボタン > 開始: 00000000、終了:FFFFFFFF

さぁ、始めよう:

  1. ファイルメニュー >添付: 選択しLogiOptionsMgr.exeて添付
  2. シンボルをロードしますd3d9.dll(これは 1 回だけ実行されます)。
    • シンボル タブ: 左パネル > 「d3d9.dll」モジュール > コンテキスト メニュー: 「このモジュールのシンボルをダウンロード」
  3. プログラム コード内のこの場所を見つけます (LogiOptionsMgr.exe+0xd4343上記の呼び出しスタックの #9):
    1. 以前に中断したスレッドに切り替えます — スレッドタブ (x64dbg):
      1. 1「サスペンドカウント」列またはTID Process Hacker、10進数→「ID」列x64dbg、16進数で見つけます
      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. プログラムのこの部分を「ステップオーバー」モードF8movzx 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プログラムの実行を再開すると、作成されたリソースはCoInitializeそしてDirect3DCreate9Ex(asm の上記を参照) が適切に解放され、スレッドが終了し、次のレコードがログ タブに表示されます (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. チェックコード実行パス(ループはスキップする必要があります) - 「ステップオーバー」F8(または「アニメ終了」、または使用トレース
  4. プログラムの実行を再開します - 「実行」F9; コード実行パスを再度繰り返す必要があります:
    • リソースが解放される
    • スレッドは終了します(終了)
    • 対応する記録がログタブに表示されます

パッチをコミットするには、「パッチ」ダイアログを開きCtrlPもう一度「パッチ ファイル」ボタンをクリックします (パッチを一時的にLogiOptionsMgr.exe別の場所に保存し、元のパッチを置き換えます)。

デバッガをデタッチすることを忘れないでください(ファイルメニュー >切り離す)、またはLogiOptionsMgr.exeプロセスを直ちに終了する(デバッグメニュー >閉じるAlt+F2)を置き換えてくださいLogiOptionsMgr.exe

注記:上記の実行中に、minidump\dump-*_*.dmpディレクトリ内にミニダンプが表示される場合がありますがLogiOptionsMgr.exe、削除しても安全です。

注記:一般的なケースでは、 を置き換えた後、logoff + + 、+ / loginでLogiOptionsMgr.exeその親 ( ) を再起動する方が適切です。LogiOptions.exeCtrlAltDeleteAltL

関連情報