2

C# クライアント アプリケーションのメモリ リークを診断しようとしています。このアプリケーション:

  • 強化された Windows 環境で実行されます
  • ローカルの管理されていないサードパーティ API と通信します
  • tcp 経由でサーバー アプリケーションと通信します
  • waveOutWrite() 経由で wav ファイルを再生します
  • キーボード ベンダー dll を介してカスタム USB キーボードと統合
  • サードパーティ API に対してアクションを実行するためのユーザー入力を受け入れます

お客様の構成に応じて、通常の使用でアプリケーションは 50 ~ 100 MB のメモリを使用します。このアプリケーションの最新の更新は、数週間問題なく実行されました (この間、メモリの問題は確認されていません)。その後、お客様が認識しているコードの変更やクライアント マシンへの変更は一切行われませんでしたが、次のような問題が発生し始めました。

  • メモリ不足の例外がスローされるまで、制御されていない、急激な、または緩やかなメモリの増加
  • カスタム キーボードからの断続的な遅延/不規則な応答性
  • オーディオを再生しようとすると、waveOutWrite() がエラー値 1 を返します (メモリが最大使用量に近づく前に発生します)。

DebugDiag 1.2 を使用してリークを監視し、結果として完全なダンプを取得しました。分析からの最初の警告は次のとおりです。

DebugDiag メモリ警告

ダンプは、ネイティブ ヒープに 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 にはほど遠いです.

いずれにせよ、この時点では、これらの割り当てが何であるか、または何が割り当てられているかを理解する方法がわかりません. そして、私たちの側でコードを変更することなく、なぜ問題が発生し始めたのか、私は途方に暮れています. お客様のシステムで、お客様が認識していない何かが変更され、コードのバグが明らかになったと想定する必要がありますが、これまでのところ、根本的な原因を突き止めることができませんでした。

どんな助けでも大歓迎です!

4

0 に答える 0