私は次の仕様の 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 NVIDIA GeForce RTX 3060 Ti (200 ワット)
logioptionsmgr.exe
が最大 30% 消費されるのはなぜですか?- Logitech サポート: Logitech Options の GPU 負荷が高い NVIDIA GeForce RTX 20?0 Superの8%
- Logitech サポート:
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 (250 ワット) の 21%。 - Logitech ソフトウェア *警告* T あり
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です。ない 脆弱。
注記:の 1 つのスレッドを一時停止したことを覚えておいてくださいLogiOptionsMgr.exe
。
必要なのは64dbg のデバッガー。すでに使用経験があると思いますが、そうでない場合は、デバッガーの操作を簡単にする設定がいくつかあります ([オプション] メニュー > [設定])。
- イベントタブ > 「ブレークオン」 — これらすべての選択を解除します (将来的には、「エントリブレークポイント*」と「ブレークポイントのアタッチ」を有効にしてみてください)
- 例外タブ:「範囲を追加」ボタン > 開始:
00000000
、終了:FFFFFFFF
さぁ、始めよう:
- ファイルメニュー >添付: 選択し
LogiOptionsMgr.exe
て添付 - シンボルをロードします
d3d9.dll
(これは 1 回だけ実行されます)。- シンボル タブ: 左パネル > 「d3d9.dll」モジュール > コンテキスト メニュー: 「このモジュールのシンボルをダウンロード」
- プログラム コード内のこの場所を見つけます (
LogiOptionsMgr.exe+0xd4343
上記の呼び出しスタックの #9):- 以前に中断したスレッドに切り替えます — スレッドタブ (x64dbg):
1
「サスペンドカウント」列またはTID Process Hacker、10進数→「ID」列x64dbg、16進数で見つけます- ダブルクリックしてください
- スタックの一番上にいます — 少しロールバックします:
- コールスタックタブのコンテキストメニュー: "疑わしいコールスタックフレームを表示する「
- コメント列で、「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 の上記を参照) が適切に解放され、スレッドが終了し、次のレコードがログ タブに表示されます (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:インポートボタン
- 再起動
- チェックコード実行パス(ループはスキップする必要があります) - 「ステップオーバー」F8(または「アニメ終了」、または使用トレース)
- プログラムの実行を再開します - 「実行」F9; コード実行パスを再度繰り返す必要があります:
- リソースが解放される
- スレッドは終了します(終了)
- 対応する記録がログタブに表示されます
パッチをコミットするには、「パッチ」ダイアログを開きCtrl、Pもう一度「パッチ ファイル」ボタンをクリックします (パッチを一時的にLogiOptionsMgr.exe
別の場所に保存し、元のパッチを置き換えます)。
デバッガをデタッチすることを忘れないでください(ファイルメニュー >切り離す)、またはLogiOptionsMgr.exe
プロセスを直ちに終了する(デバッグメニュー >閉じるAlt+F2)を置き換えてくださいLogiOptionsMgr.exe
。
注記:上記の実行中に、minidump\dump-*_*.dmp
ディレクトリ内にミニダンプが表示される場合がありますがLogiOptionsMgr.exe
、削除しても安全です。
注記:一般的なケースでは、 を置き換えた後、logoff + + 、+ / loginでLogiOptionsMgr.exe
その親 ( ) を再起動する方が適切です。LogiOptions.exe
CtrlAltDeleteAltL