Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用DebugDiag和WinDbg调查.Net应用程序中的内存泄漏_C#_.net_Memory Leaks_Windbg_Debugdiag - Fatal编程技术网

C# 使用DebugDiag和WinDbg调查.Net应用程序中的内存泄漏

C# 使用DebugDiag和WinDbg调查.Net应用程序中的内存泄漏,c#,.net,memory-leaks,windbg,debugdiag,C#,.net,Memory Leaks,Windbg,Debugdiag,我试图诊断C#客户端应用程序中的内存泄漏。此应用程序: 在强化的Windows环境中运行 与本地未管理的第三方API通信 通过tcp与服务器应用程序通信 通过waveOutWrite()播放wav文件 通过键盘供应商dll与自定义USB键盘集成 接受用户输入以对第三方API执行操作 根据客户的配置,正常使用情况下的应用程序使用的内存介于50到100 MB之间。我们对该应用程序的最新更新运行了数周,没有出现问题(确认在此期间没有内存问题)。然后,在没有任何代码更改或客户意识到的对客户机的任何更

我试图诊断C#客户端应用程序中的内存泄漏。此应用程序:

  • 在强化的Windows环境中运行
  • 与本地未管理的第三方API通信
  • 通过tcp与服务器应用程序通信
  • 通过waveOutWrite()播放wav文件
  • 通过键盘供应商dll与自定义USB键盘集成
  • 接受用户输入以对第三方API执行操作
根据客户的配置,正常使用情况下的应用程序使用的内存介于50到100 MB之间。我们对该应用程序的最新更新运行了数周,没有出现问题(确认在此期间没有内存问题)。然后,在没有任何代码更改或客户意识到的对客户机的任何更改的情况下,我们开始经历以下情况:

  • 在抛出OutOfMemoryException之前,不受控制、快速和/或渐进的内存增长
  • 来自自定义键盘的间歇性延迟/不稳定响应
  • waveOutWrite()在尝试播放音频时返回错误值1(发生在内存接近最大使用量之前)
我使用了DebugDiag 1.2来监控泄漏,并得到了完整的转储。分析中的初始警告包括:

Dump在本机堆中显示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

不管是哪种方式,我都不知道现在该如何弄清楚这些分配是什么,或者是什么导致了这些分配。我不明白为什么在没有任何代码更改的情况下,问题会开始出现。我不得不假设客户系统发生了一些他们不知道的变化,这暴露了我们代码中的错误,但到目前为止,我还没有找到根本原因


任何帮助都将不胜感激

通过打开支持案例并与Microsoft共享转储。仅凭你自己是不可能仅凭互联网上的提示来分析的。那么免费区块呢?内存可能已经被使用,然后通过C++堆管理器(MaloC)被释放,它仍然在OS视图中使用(ValualLoC)。63MB堆的Debug Gebug报告表明几乎全部634 MB都被保留和提交。这就是你的意思,还是我还需要看一些别的东西?保留和承诺的术语与操作系统的观点有关。在提交的内存中,堆管理器可能将内存标记为“空闲”,这意味着它可以在需要时重新使用。@SeanTomas:你能和我共享转储吗?我想玩玩
!地址
!堆
!dumpheap
和类似文件。通常这只是一个误解,而不是微软方面的错误。您可以通过电子邮件发送至windbg.yyy-mm-dd@lockerflockig.de其中yyyy mm dd是今天的日期(垃圾邮件过滤器)