C# クライアント アプリケーションのメモリ リークを診断しようとしています。このアプリケーション:
- 強化された Windows 環境で実行されます
- ローカルの管理されていないサードパーティ API と通信します
- tcp 経由でサーバー アプリケーションと通信します
- waveOutWrite() 経由で wav ファイルを再生します
- キーボード ベンダー dll を介してカスタム USB キーボードと統合
- サードパーティ API に対してアクションを実行するためのユーザー入力を受け入れます
お客様の構成に応じて、通常の使用でアプリケーションは 50 ~ 100 MB のメモリを使用します。このアプリケーションの最新の更新は、数週間問題なく実行されました (この間、メモリの問題は確認されていません)。その後、お客様が認識しているコードの変更やクライアント マシンへの変更は一切行われませんでしたが、次のような問題が発生し始めました。
- メモリ不足の例外がスローされるまで、制御されていない、急激な、または緩やかなメモリの増加
- カスタム キーボードからの断続的な遅延/不規則な応答性
- オーディオを再生しようとすると、waveOutWrite() がエラー値 1 を返します (メモリが最大使用量に近づく前に発生します)。
DebugDiag 1.2 を使用してリークを監視し、結果として完全なダンプを取得しました。分析からの最初の警告は次のとおりです。
ダンプは、ネイティブ ヒープに 1.19 GB の割り当てを示しています。634MB はMicrosoft VC ランタイム ヒープ (プライベート)から、549MB は DebugDiag LeakTrack ヒープからのものです。634MB ヒープには 44 個のセグメントがあり、そのほとんどが 15.81MB です。
ただし、割り当てレポートは対応していないようです。サイズ別のトップ割り当ては 992KB であり、数量 3 でカウント別のトップでもあります。634MB ヒープのトップ割り当ては次のとおりです。
私はこれを間違って読んでいますか?
WinDbg に移動し、実行する!heap -stat -h [634MBheapaddress] -grp B
と、次のようになります。
group-by: BLOCKCOUNT max-display: 20
size #blocks total ( %) (percent of totalblocks)
44 9ea51 - 2a23d84 (44.14)
1a 1fba7 - 338ef6 (8.83)
18 1b3b8 - 28d940 (7.58)
10 16913 - 169130 (6.28)
12 1222c - 146718 (5.05)
22 d9d0 - 1ceda0 (3.79)
1c 9bea - 110d98 (2.71)
14 9197 - b5fcc (2.53)
26 9115 - 15891e (2.52)
20 6774 - cee80 (1.80)
24 5094 - b54d0 (1.40)
30 4b03 - e1090 (1.30)
78 4a81 - 22ec78 (1.30)
28 48d2 - b60d0 (1.27)
4 48bb - 122ec (1.26)
58 48aa - 18fa70 (1.26)
1e 48a6 - 88374 (1.26)
2a 48a3 - beabe (1.26)
16 4898 - 63d10 (1.26)
600 4884 - 1b31800 (1.26)
これを正しく読んでいる場合、最上位の割り当てが 68 バイトであり、650k の割り当てがあることを示しています。これは正しいです?もしそうなら、それは潜在的な問題である可能性がありますが、44MB しか表していません - 私が予約済みとして示している 650MB にはほど遠いです.
いずれにせよ、この時点では、これらの割り当てが何であるか、または何が割り当てられているかを理解する方法がわかりません. そして、私たちの側でコードを変更することなく、なぜ問題が発生し始めたのか、私は途方に暮れています. お客様のシステムで、お客様が認識していない何かが変更され、コードのバグが明らかになったと想定する必要がありますが、これまでのところ、根本的な原因を突き止めることができませんでした。
どんな助けでも大歓迎です!