使用WinDug工具調試c#程序或c++程序的dmp崩潰文件,調試內存泄漏

1.調試c#程序內存泄漏步驟

  1. 設置symbol符號路徑: SRV*c:\mysymbol* http://msdl.microsoft.com/download/symbols;d:/你的pdb文件路徑  而後保存工做空間
  2. 加載dmp文件。
  3. 加載sos文件  
    .load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos
    
  4.  加載clr
    .loadby sos clr
    .load clr
  5. 加載堆
    !dumpheap –stat 
    
  6. 根據堆的大小,判斷是哪一種類型的文件佔用內存比較高
    !dumpheap -type System.Double[]
    
  7. 調試相關的地址,找到調用堆棧
    > !gcroot 31daa0d0 
    

2.調試c++代碼的內存泄漏

  1. 跟c#的前兩步驟同樣,加載文件
  2. 獲取堆的概述信息,s的意思是summery
    !heap –s    
    

      會獲得下列數據:html

    Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast
    (k) (k) (k) (k) length blocks cont. heap
    00130000 08000002 97344 97296 97344 278 626 10 13 e c++

  3. 好比程序會增加內存,那麼堆的大小通常狀況下會變大。這時候過幾分鐘或過幾秒,再進行一下第二步,比較兩次獲得的信息,比較後找到有異常的項。 找到符合條件的特殊的堆代號,而後統計這個堆的句柄。stat是統計statistic的意思,h意思是handle。
    !heap –stat –h 00130000  
    

      

    size #blocks total ( %) (percent of total busy bytes)
    800 2cce0 - 16670000 (75.42)
    200 2cce1 - 599c200 (18.86)
    98 2ccdf - 1a9a468 (5.60)c#

  4. 根據第三步的結果,會看到一個百分比列表,找到你認爲不正常的數據,好比第一個,大小爲800字節,塊有2cce0個,總大小爲16M,這個時候用過濾的方法,過濾大小爲800的句柄。flt意思是filter過濾,s意思是size
    !heap -flt s 800 
    

      

    HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
    60b79f8 0103 0000 [00] 060b7a10 00800 - (busy)
    mscoreei!_iob
    060ba168 0103 0103 [00] 060ba180 00800 - (busy)spa

  5. 第四步會獲得不少的信息,隨便找一條試試,找到userPtr那一列,即用戶指針。而後獲取這個指針的全部信息。PageHeapOptions all information。若是找不到就換一條試試。通常狀況下很容易找的。
    !heap -p -a 060b7a10 
    

      

    MyTestD!MyTest::Dosomething+0x000000c6 
  6. 第五步若是順利的話,就能夠看到一些方法了,而後就能夠根據方法的全名去查看線程了
    u MyTestD!MyTest::Dosomething+0x000000c6
  7. 第六步若是順利的話就找到了基本的代碼行數和對應的位置了
相關文章
相關標籤/搜索